From 090739bbb7f93d768d94f4d2775f47606205c366 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Thu, 22 Feb 2024 15:25:40 +0100 Subject: [PATCH 01/20] Add dynamically resizing component able to fill up space With this, we can adaptively truncate text based on the available space. When truncated, we can display the full version in a tooltip. --- .../AdaptiveTrimmer/AdaptiveTrimmer.tsx | 140 ++++++++++++++++++ .../AdaptiveTrimmer/MaybeWithTooltip.tsx | 65 ++++++++ 2 files changed, 205 insertions(+) create mode 100644 src/app/components/AdaptiveTrimmer/AdaptiveTrimmer.tsx create mode 100644 src/app/components/AdaptiveTrimmer/MaybeWithTooltip.tsx diff --git a/src/app/components/AdaptiveTrimmer/AdaptiveTrimmer.tsx b/src/app/components/AdaptiveTrimmer/AdaptiveTrimmer.tsx new file mode 100644 index 000000000..878252654 --- /dev/null +++ b/src/app/components/AdaptiveTrimmer/AdaptiveTrimmer.tsx @@ -0,0 +1,140 @@ +import { FC, ReactNode, useCallback, useEffect, useRef, useState } from 'react' +import Box from '@mui/material/Box' +import InfoIcon from '@mui/icons-material/Info' +import { trimLongString } from '../../utils/trimLongString' +import { MaybeWithTooltip } from './MaybeWithTooltip' + +type AdaptiveTrimmerProps = { + text: string | undefined + strategy: 'middle' | 'end' + extraTooltip?: ReactNode +} + +/** + * Display content, potentially shortened as needed. + * + * This component will do automatic detection of available space, + * and determine the best way to display content accordingly. + */ +export const AdaptiveTrimmer: FC = ({ text = '', strategy = 'end', extraTooltip }) => { + // Initial setup + const fullLength = text.length + const textRef = useRef(null) + + // Data about the currently rendered version + const [currentContent, setCurrentContent] = useState('') + const [currentLength, setCurrentLength] = useState(0) + + // Known good - this fits + const [largestKnownGood, setLargestKnownGood] = useState(0) + + // Known bad - this doesn't fit + const [smallestKnownBad, setSmallestKnownBad] = useState(fullLength + 1) + + // Are we exploring our possibilities now? + const [inDiscovery, setInDiscovery] = useState(false) + + const attemptContent = useCallback((content: string, length: number) => { + setCurrentContent(content) + setCurrentLength(length) + }, []) + + const attemptShortenedContent = useCallback( + (length: number) => { + const content = + strategy === 'middle' + ? trimLongString(text, Math.floor(length / 2) - 1, Math.floor(length / 2) - 1)! + : trimLongString(text, length, 0)! + + attemptContent(content, length) + }, + [strategy, text, attemptContent], + ) + + const initDiscovery = useCallback(() => { + setLargestKnownGood(0) + setSmallestKnownBad(fullLength + 1) + attemptContent(text, fullLength) + setInDiscovery(true) + }, [text, fullLength, attemptContent]) + + useEffect(() => { + initDiscovery() + const handleResize = () => { + initDiscovery() + } + + window.addEventListener('resize', handleResize) + return () => window.removeEventListener('resize', handleResize) + }, [initDiscovery]) + + useEffect(() => { + if (inDiscovery) { + if (!textRef.current) { + return + } + const isOverflow = textRef.current.scrollWidth > textRef.current.clientWidth + + if (isOverflow) { + // This is too much + + // Update known bad length + const newSmallestKnownBad = Math.min(currentLength, smallestKnownBad) + setSmallestKnownBad(newSmallestKnownBad) + + // We should try something smaller + attemptShortenedContent(Math.floor((largestKnownGood + newSmallestKnownBad) / 2)) + } else { + // This is OK + + // Update known good length + const newLargestKnownGood = Math.max(currentLength, largestKnownGood) + setLargestKnownGood(currentLength) + + if (currentLength === fullLength) { + // The whole thing fits, so we are good. + setInDiscovery(false) + } else { + if (currentLength + 1 === smallestKnownBad) { + // This the best we can do, for now + setInDiscovery(false) + } else { + // So far, so good, but we should try something longer + attemptShortenedContent(Math.floor((newLargestKnownGood + smallestKnownBad) / 2)) + } + } + } + } + }, [inDiscovery, currentLength, largestKnownGood, smallestKnownBad, attemptShortenedContent, fullLength]) + + if (!text) return null + + const title = + currentLength !== fullLength ? ( + + {text} + {extraTooltip && ( + + + {extraTooltip} + + )} + + ) : ( + extraTooltip + ) + + return ( + + + {currentContent} + + + ) +} diff --git a/src/app/components/AdaptiveTrimmer/MaybeWithTooltip.tsx b/src/app/components/AdaptiveTrimmer/MaybeWithTooltip.tsx new file mode 100644 index 000000000..4edfe0c26 --- /dev/null +++ b/src/app/components/AdaptiveTrimmer/MaybeWithTooltip.tsx @@ -0,0 +1,65 @@ +import { FC, ReactNode } from 'react' +import Tooltip from '@mui/material/Tooltip' +import Box from '@mui/material/Box' +import { SxProps } from '@mui/material/styles' + +type MaybeWithTooltipProps = { + /** + * Do we want to show the tooltip? + * + * Default is true + */ + tooltipWanted?: boolean + + /** + * What should be the content of the tooltip? + * + * Undefined means no tooltip + */ + title?: ReactNode + + /** + * Any extra styles to apply to the span + */ + spanSx?: SxProps + + /** + * The content to show + */ + children: ReactNode +} + +/** + * A component to display some content with or without a tooltip + */ +export const MaybeWithTooltip: FC = ({ + tooltipWanted = true, + title, + children, + spanSx, +}) => + tooltipWanted && !!title ? ( + + {title} + + } + > + + {children} + + + ) : ( + + {children} + + ) From d43edd58a2560f9f1136dfff3d318be323a07c06 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 03:45:29 +0100 Subject: [PATCH 02/20] Re-style account link to fill space on mobile --- .changelog/1290.trivial.md | 1 + src/app/components/Account/AccountLink.tsx | 104 +++++++++++++++--- .../StyledDescriptionList/index.tsx | 2 + 3 files changed, 89 insertions(+), 18 deletions(-) create mode 100644 .changelog/1290.trivial.md diff --git a/.changelog/1290.trivial.md b/.changelog/1290.trivial.md new file mode 100644 index 000000000..4182da1ae --- /dev/null +++ b/.changelog/1290.trivial.md @@ -0,0 +1 @@ +Update how links and hashes are displayed on mobile diff --git a/src/app/components/Account/AccountLink.tsx b/src/app/components/Account/AccountLink.tsx index b204aa377..19ce16b86 100644 --- a/src/app/components/Account/AccountLink.tsx +++ b/src/app/components/Account/AccountLink.tsx @@ -1,40 +1,108 @@ -import { FC } from 'react' +import { FC, ReactNode } from 'react' import { Link as RouterLink } from 'react-router-dom' import { useScreenSize } from '../../hooks/useScreensize' import Link from '@mui/material/Link' -import { TrimLinkLabel } from '../TrimLinkLabel' import { RouteUtils } from '../../utils/route-utils' +import InfoIcon from '@mui/icons-material/Info' import Typography from '@mui/material/Typography' import { COLORS } from '../../../styles/theme/colors' import { SearchScope } from '../../../types/searchScope' +import { trimLongString } from '../../utils/trimLongString' +import { MaybeWithTooltip } from '../AdaptiveTrimmer/MaybeWithTooltip' +import { AdaptiveTrimmer } from '../AdaptiveTrimmer/AdaptiveTrimmer' -export const AccountLink: FC<{ - scope: SearchScope - address: string - alwaysTrim?: boolean +const WithTypographyAndLink: FC<{ + to: string plain?: boolean -}> = ({ scope, address, alwaysTrim, plain }) => { - const { isTablet } = useScreenSize() - const to = RouteUtils.getAccountRoute(scope, address) + mobile?: boolean + children: ReactNode +}> = ({ children, to, plain, mobile }) => { return ( - {alwaysTrim || isTablet ? ( - - ) : plain ? ( - address + {plain ? ( + children ) : ( - {address} + {children} )} ) } + +export const AccountLink: FC<{ + scope: SearchScope + address: string + + /** + * Should we always trim the text to a short line? + */ + alwaysTrim?: boolean + + /** + * Plain mode? (No link required) + */ + plain?: boolean + + /** + * Any extra tooltips to display + * + * (Besides the content necessary because of potential shortening) + */ + extraTooltip?: ReactNode +}> = ({ scope, address, alwaysTrim, plain, extraTooltip }) => { + const { isTablet } = useScreenSize() + const to = RouteUtils.getAccountRoute(scope, address) + + const tooltipPostfix = extraTooltip ? ( + <> + + {extraTooltip} + + ) : undefined + + // Are we in a table? + if (alwaysTrim) { + // In a table, we only ever want one short line + + return ( + + {trimLongString(address, 6, 6)} + + ) + } + + if (!isTablet) { + // Details in desktop mode. + // We want one long line, with name and address. + + return ( + + {address} + + ) + } + + // We need to show the data in details mode on mobile. + // We want two lines, one for name (if available), one for address + // Both line adaptively shortened to fill available space + return ( + + + + ) +} diff --git a/src/app/components/StyledDescriptionList/index.tsx b/src/app/components/StyledDescriptionList/index.tsx index 2ba5058ac..08865f369 100644 --- a/src/app/components/StyledDescriptionList/index.tsx +++ b/src/app/components/StyledDescriptionList/index.tsx @@ -61,6 +61,8 @@ export const StyledDescriptionList = styled(InlineDescriptionList, { color: COLORS.brandExtraDark, overflowWrap: 'anywhere', alignItems: 'center', + maxWidth: '100%', + overflowX: 'hidden', }, ...(standalone && { '&&': { From f5c192f1b693b0e5b8c11034710b1ec34b6082c4 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 03:46:09 +0100 Subject: [PATCH 03/20] Make sure account links are always used correctly --- .../Account/ContractCreatorInfo.tsx | 25 ++++++--- src/app/components/Account/index.tsx | 1 + src/app/components/AccountList/index.tsx | 2 +- src/app/components/Tokens/TokenHolders.tsx | 6 +- src/app/components/Tokens/TokenList.tsx | 6 +- src/app/components/Tokens/TokenTransfers.tsx | 4 +- .../Transactions/ConsensusTransactions.tsx | 23 +++----- .../Transactions/RuntimeTransactions.tsx | 56 ++++++------------- .../AccountNFTCollectionCard.tsx | 2 +- .../AccountDetailsPage/AccountTokensCard.tsx | 14 ++++- .../InstanceTitleCard.tsx | 2 +- .../RuntimeTransactionDetailPage/index.tsx | 36 +++++------- src/app/pages/TokenDashboardPage/NFTLinks.tsx | 5 +- .../TokenDashboardPage/TokenDetailsCard.tsx | 6 +- .../TokenDashboardPage/TokenTitleCard.tsx | 6 +- 15 files changed, 98 insertions(+), 96 deletions(-) diff --git a/src/app/components/Account/ContractCreatorInfo.tsx b/src/app/components/Account/ContractCreatorInfo.tsx index a944c8362..fed858109 100644 --- a/src/app/components/Account/ContractCreatorInfo.tsx +++ b/src/app/components/Account/ContractCreatorInfo.tsx @@ -14,7 +14,11 @@ import Box from '@mui/material/Box' import Skeleton from '@mui/material/Skeleton' import { useScreenSize } from '../../hooks/useScreensize' -const TxSender: FC<{ scope: SearchScope; txHash: string }> = ({ scope, txHash }) => { +const TxSender: FC<{ scope: SearchScope; txHash: string; alwaysTrim?: boolean }> = ({ + scope, + txHash, + alwaysTrim, +}) => { const { t } = useTranslation() if (scope.layer === Layer.consensus) { throw AppErrors.UnsupportedLayer @@ -31,7 +35,7 @@ const TxSender: FC<{ scope: SearchScope; txHash: string }> = ({ scope, txHash }) }} /> ) : senderAddress ? ( - + ) : ( t('common.missing') ) @@ -41,7 +45,8 @@ export const ContractCreatorInfo: FC<{ scope: SearchScope isLoading?: boolean creationTxHash: string | undefined -}> = ({ scope, isLoading, creationTxHash }) => { + alwaysTrim?: boolean +}> = ({ scope, isLoading, creationTxHash, alwaysTrim }) => { const { t } = useTranslation() const { isMobile } = useScreenSize() @@ -59,9 +64,9 @@ export const ContractCreatorInfo: FC<{ minWidth: '25%', }} > - + {t('contract.createdAt')} - + ) } @@ -69,7 +74,8 @@ export const ContractCreatorInfo: FC<{ export const DelayedContractCreatorInfo: FC<{ scope: SearchScope contractOasisAddress: string | undefined -}> = ({ scope, contractOasisAddress }) => { + alwaysTrim?: boolean +}> = ({ scope, contractOasisAddress, alwaysTrim }) => { const accountQuery = useGetRuntimeAccountsAddress( scope.network, scope.layer as Runtime, @@ -82,6 +88,11 @@ export const DelayedContractCreatorInfo: FC<{ const creationTxHash = contract?.eth_creation_tx || contract?.creation_tx return ( - + ) } diff --git a/src/app/components/Account/index.tsx b/src/app/components/Account/index.tsx index 3658ba25d..71bca39d4 100644 --- a/src/app/components/Account/index.tsx +++ b/src/app/components/Account/index.tsx @@ -100,6 +100,7 @@ export const Account: FC = ({ account, token, isLoading, tokenPric diff --git a/src/app/components/AccountList/index.tsx b/src/app/components/AccountList/index.tsx index 89050ff45..7f467c356 100644 --- a/src/app/components/AccountList/index.tsx +++ b/src/app/components/AccountList/index.tsx @@ -39,7 +39,7 @@ export const AccountList: FC = ({ isLoading, limit, pagination key: 'size', }, { - content: , + content: , key: 'address', }, ...(verbose diff --git a/src/app/components/Tokens/TokenHolders.tsx b/src/app/components/Tokens/TokenHolders.tsx index 77daeae62..8bc52e63b 100644 --- a/src/app/components/Tokens/TokenHolders.tsx +++ b/src/app/components/Tokens/TokenHolders.tsx @@ -53,7 +53,11 @@ export const TokenHolders: FC = ({ { key: 'address', content: ( - + ), }, { diff --git a/src/app/components/Tokens/TokenList.tsx b/src/app/components/Tokens/TokenList.tsx index 676f8aa60..ec2e0bea4 100644 --- a/src/app/components/Tokens/TokenList.tsx +++ b/src/app/components/Tokens/TokenList.tsx @@ -107,7 +107,11 @@ export const TokenList = (props: TokensProps) => { { content: ( - + ), diff --git a/src/app/components/Tokens/TokenTransfers.tsx b/src/app/components/Tokens/TokenTransfers.tsx index fdf69be27..a0b70bbfe 100644 --- a/src/app/components/Tokens/TokenTransfers.tsx +++ b/src/app/components/Tokens/TokenTransfers.tsx @@ -186,7 +186,7 @@ export const TokenTransfers: FC = ({ {trimLongString(fromAddress)} ) : ( - + )} @@ -210,7 +210,7 @@ export const TokenTransfers: FC = ({ {trimLongString(toAddress)} ) : ( - + ), }, ...(differentTokens diff --git a/src/app/components/Transactions/ConsensusTransactions.tsx b/src/app/components/Transactions/ConsensusTransactions.tsx index 928ee697e..45518dbf4 100644 --- a/src/app/components/Transactions/ConsensusTransactions.tsx +++ b/src/app/components/Transactions/ConsensusTransactions.tsx @@ -1,11 +1,9 @@ import { FC } from 'react' import { useTranslation } from 'react-i18next' import Box from '@mui/material/Box' -import Typography from '@mui/material/Typography' import { Transaction } from '../../../oasis-nexus/api' import { Table, TableCellAlign, TableColProps } from '../../components/Table' import { RoundedBalance } from '../../components/RoundedBalance' -import { trimLongString } from '../../utils/trimLongString' import { TablePaginationProps } from '../Table/TablePagination' import { BlockLink } from '../Blocks/BlockLink' import { AccountLink } from '../Account/AccountLink' @@ -66,7 +64,7 @@ export const ConsensusTransactions: FC = ({ key: 'success', }, { - content: , + content: , key: 'hash', }, { @@ -95,19 +93,12 @@ export const ConsensusTransactions: FC = ({ pr: 3, }} > - {!!ownAddress && transaction.sender === ownAddress ? ( - - {trimLongString(transaction.sender)} - - ) : ( - - )} + ), key: 'from', diff --git a/src/app/components/Transactions/RuntimeTransactions.tsx b/src/app/components/Transactions/RuntimeTransactions.tsx index 0734a689d..dd2519673 100644 --- a/src/app/components/Transactions/RuntimeTransactions.tsx +++ b/src/app/components/Transactions/RuntimeTransactions.tsx @@ -14,8 +14,6 @@ import { TablePaginationProps } from '../Table/TablePagination' import { BlockLink } from '../Blocks/BlockLink' import { AccountLink } from '../Account/AccountLink' import { TransactionLink } from './TransactionLink' -import { trimLongString } from '../../utils/trimLongString' -import Typography from '@mui/material/Typography' import { doesAnyOfTheseLayersSupportEncryptedTransactions } from '../../../types/layers' import { TransactionEncryptionStatus } from '../TransactionEncryptionStatus' import { Age } from '../Age' @@ -104,11 +102,7 @@ export const RuntimeTransactions: FC = ({ : []), { content: ( - + ), key: 'hash', }, @@ -139,24 +133,15 @@ export const RuntimeTransactions: FC = ({ pr: 3, }} > - {!!ownAddress && - (transaction.sender_0_eth === ownAddress || transaction.sender_0 === ownAddress) ? ( - - {trimLongString(transaction.sender_0_eth || transaction.sender_0)} - - ) : ( - - )} + {targetAddress && ( @@ -168,19 +153,14 @@ export const RuntimeTransactions: FC = ({ }, { content: targetAddress ? ( - !!ownAddress && (transaction.to_eth === ownAddress || transaction.to === ownAddress) ? ( - - {trimLongString(targetAddress)} - - ) : ( - - ) + ) : null, key: 'to', }, diff --git a/src/app/pages/AccountDetailsPage/AccountNFTCollectionCard.tsx b/src/app/pages/AccountDetailsPage/AccountNFTCollectionCard.tsx index a03739e64..3ab574b8b 100644 --- a/src/app/pages/AccountDetailsPage/AccountNFTCollectionCard.tsx +++ b/src/app/pages/AccountDetailsPage/AccountNFTCollectionCard.tsx @@ -44,7 +44,7 @@ export const AccountNFTCollectionCard: FC = ({ scope, add isFetched && firstToken && ( - + ) diff --git a/src/app/pages/AccountDetailsPage/AccountTokensCard.tsx b/src/app/pages/AccountDetailsPage/AccountTokensCard.tsx index 71e15c55e..b7b6f3a53 100644 --- a/src/app/pages/AccountDetailsPage/AccountTokensCard.tsx +++ b/src/app/pages/AccountDetailsPage/AccountTokensCard.tsx @@ -30,10 +30,14 @@ type AccountTokensCardProps = AccountDetailsContext & { export const accountTokenContainerId = 'tokens' -export const ContractLink: FC<{ scope: SearchScope; address: string }> = ({ scope, address }) => { +export const ContractLink: FC<{ scope: SearchScope; address: string; alwaysTrim?: boolean }> = ({ + scope, + address, + alwaysTrim, +}) => { return ( - + ) @@ -79,7 +83,11 @@ export const AccountTokensCard: FC = ({ scope, account, { content: ( - + ), key: 'hash', diff --git a/src/app/pages/NFTInstanceDashboardPage/InstanceTitleCard.tsx b/src/app/pages/NFTInstanceDashboardPage/InstanceTitleCard.tsx index ef0b1d0e1..beb512b66 100644 --- a/src/app/pages/NFTInstanceDashboardPage/InstanceTitleCard.tsx +++ b/src/app/pages/NFTInstanceDashboardPage/InstanceTitleCard.tsx @@ -66,7 +66,7 @@ export const InstanceTitleCard: FC = ({ isFetched, isLoa }} > - + diff --git a/src/app/pages/RuntimeTransactionDetailPage/index.tsx b/src/app/pages/RuntimeTransactionDetailPage/index.tsx index 0ea100a08..72897ea8c 100644 --- a/src/app/pages/RuntimeTransactionDetailPage/index.tsx +++ b/src/app/pages/RuntimeTransactionDetailPage/index.tsx @@ -270,24 +270,21 @@ export const RuntimeTransactionDetailView: FC<{ <>
{t('common.from')}
- - - + /> {from && }
@@ -297,21 +294,18 @@ export const RuntimeTransactionDetailView: FC<{ <>
{t('common.to')}
- - - + /> {to && }
diff --git a/src/app/pages/TokenDashboardPage/NFTLinks.tsx b/src/app/pages/TokenDashboardPage/NFTLinks.tsx index e70dd170d..a2c6979dc 100644 --- a/src/app/pages/TokenDashboardPage/NFTLinks.tsx +++ b/src/app/pages/TokenDashboardPage/NFTLinks.tsx @@ -66,8 +66,9 @@ export const NFTInstanceLink: FC = ({ scope, instance }) => { type NFTOwnerLinkProps = { scope: SearchScope owner: string + alwaysTrim?: boolean } -export const NFTOwnerLink: FC = ({ scope, owner }) => { +export const NFTOwnerLink: FC = ({ scope, owner, alwaysTrim }) => { const { t } = useTranslation() return ( @@ -76,7 +77,7 @@ export const NFTOwnerLink: FC = ({ scope, owner }) => { i18nKey="nft.ownerLink" t={t} components={{ - OwnerLink: , + OwnerLink: , }} /> diff --git a/src/app/pages/TokenDashboardPage/TokenDetailsCard.tsx b/src/app/pages/TokenDashboardPage/TokenDetailsCard.tsx index caa1511f5..7c6f91ac9 100644 --- a/src/app/pages/TokenDashboardPage/TokenDetailsCard.tsx +++ b/src/app/pages/TokenDashboardPage/TokenDetailsCard.tsx @@ -69,7 +69,11 @@ export const TokenDetailsCard: FC<{ scope: SearchScope; address: string; searchT
{t('contract.creator')}
- +
{t('common.balance')}
diff --git a/src/app/pages/TokenDashboardPage/TokenTitleCard.tsx b/src/app/pages/TokenDashboardPage/TokenTitleCard.tsx index cfad3b218..fdfb5ab8a 100644 --- a/src/app/pages/TokenDashboardPage/TokenTitleCard.tsx +++ b/src/app/pages/TokenDashboardPage/TokenTitleCard.tsx @@ -25,7 +25,11 @@ export const TokenTitleCard: FC<{ scope: SearchScope; address: string; searchTer {token && ( <> - + )} From 2144e7b5489a5bc4ec66047c4178f6f71d4a3cf0 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 04:17:37 +0100 Subject: [PATCH 04/20] Update BlockHashLink for mobile --- src/app/components/Blocks/BlockLink.tsx | 34 ++++++++++++++++++++----- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/app/components/Blocks/BlockLink.tsx b/src/app/components/Blocks/BlockLink.tsx index f9673b7c8..53a55cf7c 100644 --- a/src/app/components/Blocks/BlockLink.tsx +++ b/src/app/components/Blocks/BlockLink.tsx @@ -7,6 +7,7 @@ import { RouteUtils } from '../../utils/route-utils' import { TrimLinkLabel } from '../TrimLinkLabel' import { SearchScope } from '../../../types/searchScope' import { useScreenSize } from '../../hooks/useScreensize' +import { AdaptiveTrimmer } from '../AdaptiveTrimmer/AdaptiveTrimmer' export const BlockLink: FC<{ scope: SearchScope; height: number }> = ({ scope, height }) => ( @@ -23,15 +24,34 @@ export const BlockHashLink: FC<{ alwaysTrim?: boolean }> = ({ scope, hash, height, alwaysTrim }) => { const { isTablet } = useScreenSize() - return ( - - {isTablet || alwaysTrim ? ( - - ) : ( - + const to = RouteUtils.getBlockRoute(scope, height) + + if (alwaysTrim) { + // Table view + return ( + + + + ) + } + + if (!isTablet) { + // Desktop view + return ( + + {hash} - )} + + ) + } + + // Mobile view + return ( + + + + ) } From 3d8dde034139a8dfd1799608d94ca2a59a6b8f98 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 04:25:14 +0100 Subject: [PATCH 05/20] Fix token transfers table on tablet --- src/app/components/Tokens/TokenTransfers.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/components/Tokens/TokenTransfers.tsx b/src/app/components/Tokens/TokenTransfers.tsx index a0b70bbfe..7daecf45b 100644 --- a/src/app/components/Tokens/TokenTransfers.tsx +++ b/src/app/components/Tokens/TokenTransfers.tsx @@ -116,7 +116,7 @@ export const TokenTransfers: FC = ({ ownAddress, }) => { const { t } = useTranslation() - const { isMobile } = useScreenSize() + const { isTablet } = useScreenSize() const tableColumns: TableColProps[] = [ { key: 'hash', content: t('common.hash') }, { key: 'block', content: t('common.block') }, @@ -139,7 +139,7 @@ export const TokenTransfers: FC = ({ content: ( ), From d2bf64cf488c112c9c5abf559af85619c89c20a3 Mon Sep 17 00:00:00 2001 From: Csillag Kristof Date: Fri, 23 Feb 2024 14:42:53 +0100 Subject: [PATCH 06/20] Update TransactionLink for mobile --- .../Transactions/TransactionLink.tsx | 85 +++++++++++++++---- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/src/app/components/Transactions/TransactionLink.tsx b/src/app/components/Transactions/TransactionLink.tsx index afcd30e8f..a13319bb3 100644 --- a/src/app/components/Transactions/TransactionLink.tsx +++ b/src/app/components/Transactions/TransactionLink.tsx @@ -1,33 +1,88 @@ -import { FC } from 'react' +import { FC, ReactNode } from 'react' import { Link as RouterLink } from 'react-router-dom' import Link from '@mui/material/Link' import Typography from '@mui/material/Typography' +import InfoIcon from '@mui/icons-material/Info' import { useScreenSize } from '../../hooks/useScreensize' -import { TrimLinkLabel } from '../TrimLinkLabel' import { RouteUtils } from '../../utils/route-utils' import { SearchScope } from '../../../types/searchScope' import { COLORS } from '../../../styles/theme/colors' +import { AdaptiveTrimmer } from '../AdaptiveTrimmer/AdaptiveTrimmer' +import { MaybeWithTooltip } from '../AdaptiveTrimmer/MaybeWithTooltip' +import { trimLongString } from '../../utils/trimLongString' +import Box from '@mui/material/Box' + +const WithTypographyAndLink: FC<{ children: ReactNode; plain?: boolean; mobile?: boolean; to: string }> = ({ + children, + plain, + mobile, + to, +}) => ( + + {plain ? ( + children + ) : ( + + {children} + + )} + +) export const TransactionLink: FC<{ alwaysTrim?: boolean scope: SearchScope hash: string plain?: boolean -}> = ({ alwaysTrim, hash, scope, plain }) => { - const { isMobile } = useScreenSize() + extraTooltip?: ReactNode +}> = ({ alwaysTrim, hash, scope, plain, extraTooltip }) => { + const { isTablet } = useScreenSize() const to = RouteUtils.getTransactionRoute(scope, hash) + const tooltipPostfix = extraTooltip ? ( + + + {extraTooltip} + + ) : undefined + + if (alwaysTrim) { + // Table mode + return ( + + + {hash} + {tooltipPostfix} + + } + > + {trimLongString(hash, 6, 6)} + + + ) + } + + if (!isTablet) { + // Desktop mode + return ( + + {hash} + + ) + } + // Mobile mode return ( - - {alwaysTrim || isMobile ? ( - - ) : plain ? ( - hash - ) : ( - - {hash} - - )} - + + + ) } From 35cceccdb5e118593247556b28477ab63382c860 Mon Sep 17 00:00:00 2001 From: Csillag Kristof Date: Fri, 23 Feb 2024 14:45:40 +0100 Subject: [PATCH 07/20] Make sure TransactionLink is used correctly --- .../RuntimeTransactionDetailPage/index.tsx | 42 +++++-------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/src/app/pages/RuntimeTransactionDetailPage/index.tsx b/src/app/pages/RuntimeTransactionDetailPage/index.tsx index 72897ea8c..cde8153cc 100644 --- a/src/app/pages/RuntimeTransactionDetailPage/index.tsx +++ b/src/app/pages/RuntimeTransactionDetailPage/index.tsx @@ -1,4 +1,4 @@ -import { FC, PropsWithChildren, useState } from 'react' +import { FC, useState } from 'react' import { useParams } from 'react-router-dom' import { useTranslation } from 'react-i18next' import { @@ -20,7 +20,6 @@ import Alert from '@mui/material/Alert' import { CopyToClipboard } from '../../components/CopyToClipboard' import { AppErrors } from '../../../types/errors' import { TextSkeleton } from '../../components/Skeleton' -import Box from '@mui/material/Box' import { BlockLink } from '../../components/Blocks/BlockLink' import { TransactionLink } from '../../components/Transactions/TransactionLink' import { TransactionEvents } from '../../components/Transactions/TransactionEvents' @@ -30,8 +29,6 @@ import { getNameForTicker, Ticker } from '../../../types/ticker' import { AllTokenPrices, useAllTokenPrices } from '../../../coin-gecko/api' import { CurrentFiatValue } from './CurrentFiatValue' import { AddressSwitch, AddressSwitchOption } from '../../components/AddressSwitch' -import InfoIcon from '@mui/icons-material/Info' -import Tooltip from '@mui/material/Tooltip' import { TransactionEncrypted, TransactionNotEncrypted } from '../../components/TransactionEncryptionStatus' import Typography from '@mui/material/Typography' import { LongDataDisplay } from '../../components/LongDataDisplay' @@ -145,23 +142,6 @@ export type TransactionDetailRuntimeBlock = RuntimeTransaction & { markAsNew?: boolean } -const TransactionInfoTooltip: FC> = ({ label, children }) => { - return ( - - - {label} - - } - > - {children} - - ) -} - export const RuntimeTransactionDetailView: FC<{ isLoading?: boolean transaction: TransactionDetailRuntimeBlock | undefined @@ -213,23 +193,21 @@ export const RuntimeTransactionDetailView: FC<{ <>
{t('common.hash')}
- - - + /> + {hash && }
From f561a26c227d809002ae53c2a6edc17ff3a25134 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Thu, 22 Feb 2024 15:25:40 +0100 Subject: [PATCH 08/20] Add adaptive shortener with dynamically content With this, we can adaptively truncate any content based on the available space. When truncated, we can display the full version in a tooltip. The shortened version is generated using a user-specified function. --- .../AdaptiveDynamicTrimmer.tsx | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/app/components/AdaptiveTrimmer/AdaptiveDynamicTrimmer.tsx diff --git a/src/app/components/AdaptiveTrimmer/AdaptiveDynamicTrimmer.tsx b/src/app/components/AdaptiveTrimmer/AdaptiveDynamicTrimmer.tsx new file mode 100644 index 000000000..d020a7fc2 --- /dev/null +++ b/src/app/components/AdaptiveTrimmer/AdaptiveDynamicTrimmer.tsx @@ -0,0 +1,151 @@ +import { FC, ReactNode, useCallback, useEffect, useRef, useState } from 'react' +import Box from '@mui/material/Box' +import InfoIcon from '@mui/icons-material/Info' +import { MaybeWithTooltip } from './MaybeWithTooltip' + +type AdaptiveDynamicTrimmerProps = { + getFullContent: () => { + content: ReactNode + length: number + } + getShortenedContent: (wantedLength: number) => ReactNode + extraTooltip: ReactNode +} + +/** + * Display content, potentially shortened as needed. + * + * This component will do automatic detection of available space, + * and determine the best way to display content accordingly. + * + * The difference compared to AdaptiveTrimmer is that this component + * expects a function to provide a shortened version of the components. + */ +export const AdaptiveDynamicTrimmer: FC = ({ + getFullContent, + getShortenedContent, + extraTooltip, +}) => { + // Initial setup + const textRef = useRef(null) + const { content: fullContent, length: fullLength } = getFullContent() + + // Data about the currently rendered version + const [currentContent, setCurrentContent] = useState() + const [currentLength, setCurrentLength] = useState(0) + + // Known good - this fits + const [largestKnownGood, setLargestKnownGood] = useState(0) + + // Known bad - this doesn't fit + const [smallestKnownBad, setSmallestKnownBad] = useState(fullLength + 1) + + // Are we exploring our possibilities now? + const [inDiscovery, setInDiscovery] = useState(false) + + const attemptContent = useCallback((content: ReactNode, length: number) => { + setCurrentContent(content) + setCurrentLength(length) + }, []) + + const attemptShortenedContent = useCallback( + (wantedLength: number) => attemptContent(getShortenedContent(wantedLength), wantedLength), + [attemptContent, getShortenedContent], + ) + + const initDiscovery = useCallback(() => { + setLargestKnownGood(0) + setSmallestKnownBad(fullLength + 1) + attemptContent(fullContent, fullLength) + setInDiscovery(true) + }, [fullContent, fullLength, attemptContent]) + + useEffect(() => { + initDiscovery() + const handleResize = () => { + initDiscovery() + } + + window.addEventListener('resize', handleResize) + return () => window.removeEventListener('resize', handleResize) + }, [initDiscovery]) + + useEffect(() => { + if (inDiscovery) { + if (!textRef.current) { + return + } + const isOverflow = textRef.current.scrollWidth > textRef.current.clientWidth + // log('Overflow?', isOverflow) + + if (isOverflow) { + // This is too much + + // Update known bad length + const newSmallestKnownBad = Math.min(currentLength, smallestKnownBad) + setSmallestKnownBad(newSmallestKnownBad) + + // We should try something smaller + attemptShortenedContent(Math.floor((largestKnownGood + newSmallestKnownBad) / 2)) + } else { + // This is OK + + // Update known good length + const newLargestKnownGood = Math.max(currentLength, largestKnownGood) + setLargestKnownGood(currentLength) + + if (currentLength === fullLength) { + // The whole thing fits, so we are good. + setInDiscovery(false) + } else { + if (currentLength + 1 === smallestKnownBad) { + // This the best we can do, for now + setInDiscovery(false) + } else { + // So far, so good, but we should try something longer + attemptShortenedContent(Math.floor((newLargestKnownGood + smallestKnownBad) / 2)) + } + } + } + } + }, [ + attemptShortenedContent, + currentLength, + fullContent, + fullLength, + inDiscovery, + initDiscovery, + largestKnownGood, + smallestKnownBad, + ]) + + const title = + currentLength !== fullLength ? ( + + {fullContent} + {extraTooltip && ( + + + {extraTooltip} + + )} + + ) : ( + extraTooltip + ) + + return ( + + + {currentContent} + + + ) +} From bf0f995d403eb0c02fb7bdfa9cc722731a5ce743 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Wed, 21 Feb 2024 18:03:06 +0100 Subject: [PATCH 09/20] Components for displaying shortened text with highlights --- .../AdaptiveHighlightedText.tsx | 66 +++++++++++++++++ .../HighlightedTrimmedText.tsx | 43 +++++++++++ .../HighlightedText/text-cutting.ts | 74 +++++++++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 src/app/components/HighlightedText/AdaptiveHighlightedText.tsx create mode 100644 src/app/components/HighlightedText/HighlightedTrimmedText.tsx create mode 100644 src/app/components/HighlightedText/text-cutting.ts diff --git a/src/app/components/HighlightedText/AdaptiveHighlightedText.tsx b/src/app/components/HighlightedText/AdaptiveHighlightedText.tsx new file mode 100644 index 000000000..0676bfc26 --- /dev/null +++ b/src/app/components/HighlightedText/AdaptiveHighlightedText.tsx @@ -0,0 +1,66 @@ +import { FC, ReactNode } from 'react' +import InfoIcon from '@mui/icons-material/Info' +import { HighlightedText, HighlightOptions } from './index' +import { AdaptiveDynamicTrimmer } from '../AdaptiveTrimmer/AdaptiveDynamicTrimmer' +import { HighlightedTrimmedText } from './HighlightedTrimmedText' + +type AdaptiveHighlightedTextProps = { + /** + * The text to display + */ + text: string | undefined + + /** + * The pattern to search for (and highlight) + */ + pattern: string | undefined + + /** + * Options for highlighting (case sensitivity, styling, etc.) + * + * (This is optional, sensible defaults are provided.) + */ + options?: HighlightOptions + + /** + * Extra content to put into the tooltip + */ + extraTooltip?: ReactNode +} + +/** + * Display a text with a part highlighted, potentially trimmed to an adaptive length around the highlight + */ +export const AdaptiveHighlightedText: FC = ({ + text, + pattern, + options, + extraTooltip, +}) => { + const fullContent = + + return text ? ( + ({ + content: fullContent, + length: text.length, + })} + getShortenedContent={wantedLength => ( + + )} + extraTooltip={ + extraTooltip ? ( + <> + + {extraTooltip} + + ) : undefined + } + /> + ) : undefined +} diff --git a/src/app/components/HighlightedText/HighlightedTrimmedText.tsx b/src/app/components/HighlightedText/HighlightedTrimmedText.tsx new file mode 100644 index 000000000..ff7c816b9 --- /dev/null +++ b/src/app/components/HighlightedText/HighlightedTrimmedText.tsx @@ -0,0 +1,43 @@ +import { FC } from 'react' + +import { HighlightedText, HighlightOptions } from './index' +import { cutAroundMatch } from './text-cutting' + +type HighlightedTrimmedTextProps = { + /** + * The text to display + */ + text: string | undefined + + /** + * The pattern to search for (and highlight) + */ + pattern: string | undefined + + /** + * Options for highlighting (case sensitivity, styling, etc.) + * + * (This is optional, sensible defaults are provided.) + */ + options?: HighlightOptions + + /** + * What should be the length of the fragment delivered, which + * has the pattern inside it? + */ + fragmentLength: number +} + +/** + * Display a text with a part highlighted, potentially trimmed to shorter length around the highlight + */ +export const HighlightedTrimmedText: FC = props => { + const { text, pattern, fragmentLength, options } = props + return ( + + ) +} diff --git a/src/app/components/HighlightedText/text-cutting.ts b/src/app/components/HighlightedText/text-cutting.ts new file mode 100644 index 000000000..cb7555fa6 --- /dev/null +++ b/src/app/components/HighlightedText/text-cutting.ts @@ -0,0 +1,74 @@ +import { findTextMatch, NormalizerOptions } from './text-matching' + +export interface CutAroundOptions extends NormalizerOptions { + /** + * What should be the length of the fragment delivered, which + * has the pattern inside it? + * + * The default value is 80. + */ + fragmentLength?: number +} + +/** + * Return a part of the corpus that contains the match to the pattern, if any + * + * If the corpus is undefined or empty, undefined is returned. + * + * If either the pattern is undefined or empty, or there is no match, + * an adequately sized part from the beginning of the corpus is returned. + * + * If there is a match, but the corpus is at most as long as the desired fragment length, + * the whole corpus is returned. + * + * If there is a match, and the corpus is longer than the desired fragment length, + * then a part of a corpus is returned, so that the match is within the returned part, + * around the middle. + */ +export function cutAroundMatch( + corpus: string | undefined, + pattern: string | undefined, + options: CutAroundOptions = {}, +): { + hasMatch: boolean + part: string | undefined +} { + const { fragmentLength = 80, ...matchOptions } = options + + if (!corpus) { + // there is nothing to see here + return { + hasMatch: false, + part: undefined, + } + } + + // do we have a match? + const match = pattern ? findTextMatch(corpus, [pattern], matchOptions) : undefined + + if (corpus.length <= fragmentLength) { + // the whole corpus fits into the max size, no need to cut. + return { + hasMatch: !!match, + part: corpus, + } + } + + // how much extra space do we have? + const buffer = fragmentLength - (pattern || '').length + + const matchStart = match?.startPos ?? 0 + + // We will start before the start of the match, by buffer / 2 chars + const startPos = Math.max(Math.min(matchStart - Math.floor(buffer / 2), corpus.length - fragmentLength), 0) + const endPos = Math.min(startPos + fragmentLength, corpus.length) + + // compile the result + const part = + (startPos ? '…' : '') + corpus.substring(startPos, endPos) + (endPos < corpus.length - 1 ? '…' : '') + + return { + hasMatch: true, + part, + } +} From ba2da30019befc6b0cb2f23893077c644929a298 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Sun, 11 Feb 2024 19:15:15 +0100 Subject: [PATCH 10/20] Add chance library (for random stuff) --- package.json | 2 ++ yarn.lock | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/package.json b/package.json index 9d75b9755..9a848f939 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "axios": "1.6.7", "bignumber.js": "9.1.2", "bip39": "^3.1.0", + "chance": "^1.1.11", "date-fns": "3.3.1", "ethers": "^6.11.1", "i18next": "23.10.0", @@ -102,6 +103,7 @@ "@testing-library/jest-dom": "6.4.2", "@testing-library/react": "14.2.1", "@testing-library/user-event": "14.5.2", + "@types/chance": "^1.1.6", "@types/jest": "^29.5.12", "@types/node": "20.11.20", "@types/react": "18.2.59", diff --git a/yarn.lock b/yarn.lock index 9353fb299..9d9e4681f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5377,6 +5377,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/chance@^1.1.6": + version "1.1.6" + resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.1.6.tgz#2fe3de58742629602c3fbab468093b27207f04ad" + integrity sha512-V+pm3stv1Mvz8fSKJJod6CglNGVqEQ6OyuqitoDkWywEODM/eJd1eSuIp9xt6DrX8BWZ2eDSIzbw1tPCUTvGbQ== + "@types/connect@*": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -6955,6 +6960,11 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chance@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/chance/-/chance-1.1.11.tgz#78e10e1f9220a5bbc60a83e3f28a5d8558d84d1b" + integrity sha512-kqTg3WWywappJPqtgrdvbA380VoXO2eu9VCV895JgbyHsaErXdyHK9LOZ911OvAk6L0obK7kDk9CGs8+oBawVA== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" From 45a7e8aca25ee38fe9eb689d14623c8030701ae7 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 05:06:57 +0100 Subject: [PATCH 11/20] Load the Pontus-X account names --- src/app/data/pontusx-account-names.ts | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/app/data/pontusx-account-names.ts diff --git a/src/app/data/pontusx-account-names.ts b/src/app/data/pontusx-account-names.ts new file mode 100644 index 000000000..4459e83bd --- /dev/null +++ b/src/app/data/pontusx-account-names.ts @@ -0,0 +1,43 @@ +import axios from 'axios' +import { useQuery } from '@tanstack/react-query' + +const DATA_SOURCE_URL = 'https://raw.githubusercontent.com/deltaDAO/mvg-portal/main/pontusxAddresses.json' + +type AccountMap = Map +type AccountEntry = { + name: string + address: string +} +type AccountData = { + map: AccountMap + list: AccountEntry[] +} + +const getPontusXAccountNames = () => + new Promise((resolve, reject) => { + axios.get(DATA_SOURCE_URL).then(response => { + if (response.status !== 200) reject("Couldn't load names") + if (!response.data) reject("Couldn't load names") + const map = new Map() + const list: AccountEntry[] = [] + Object.entries(response.data).forEach(([address, name]) => { + map.set(address, name) + const normalizedEntry: AccountEntry = { + name: name as string, + address, + } + list.push(normalizedEntry) + }) + resolve({ + map, + list, + }) + }, reject) + }) + +export const usePontusXAccountNames = (enabled: boolean) => { + return useQuery(['pontusXNames'], getPontusXAccountNames, { + enabled, + staleTime: Infinity, + }) +} From 67e201d3bb2914d50507f560de132294c1b07368 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 17:48:49 +0100 Subject: [PATCH 12/20] Support displaying account names --- src/app/components/Account/AccountLink.tsx | 36 +++++++++++-- src/app/data/pontusx-account-names.ts | 22 ++++++++ src/app/hooks/useAccountName.ts | 61 ++++++++++++++++++++++ 3 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 src/app/hooks/useAccountName.ts diff --git a/src/app/components/Account/AccountLink.tsx b/src/app/components/Account/AccountLink.tsx index 19ce16b86..f1f1ab53b 100644 --- a/src/app/components/Account/AccountLink.tsx +++ b/src/app/components/Account/AccountLink.tsx @@ -7,8 +7,10 @@ import InfoIcon from '@mui/icons-material/Info' import Typography from '@mui/material/Typography' import { COLORS } from '../../../styles/theme/colors' import { SearchScope } from '../../../types/searchScope' +import { useAccountName } from '../../hooks/useAccountName' import { trimLongString } from '../../utils/trimLongString' import { MaybeWithTooltip } from '../AdaptiveTrimmer/MaybeWithTooltip' +import Box from '@mui/material/Box' import { AdaptiveTrimmer } from '../AdaptiveTrimmer/AdaptiveTrimmer' const WithTypographyAndLink: FC<{ @@ -25,7 +27,7 @@ const WithTypographyAndLink: FC<{ ...(mobile ? { maxWidth: '100%', - overflowX: 'hidden', + overflow: 'hidden', } : {}), ...(plain @@ -66,6 +68,7 @@ export const AccountLink: FC<{ extraTooltip?: ReactNode }> = ({ scope, address, alwaysTrim, plain, extraTooltip }) => { const { isTablet } = useScreenSize() + const { name: accountName } = useAccountName(scope, address) const to = RouteUtils.getAccountRoute(scope, address) const tooltipPostfix = extraTooltip ? ( @@ -81,7 +84,21 @@ export const AccountLink: FC<{ return ( - {trimLongString(address, 6, 6)} + + {accountName} + {address} + {tooltipPostfix} + + ) : ( + address + ) + } + > + {accountName ? trimLongString(accountName, 12, 0) : trimLongString(address, 6, 6)} + ) } @@ -92,7 +109,15 @@ export const AccountLink: FC<{ return ( - {address} + + {accountName ? ( + + {accountName} ({address}) + + ) : ( + address + )} + ) } @@ -102,7 +127,10 @@ export const AccountLink: FC<{ // Both line adaptively shortened to fill available space return ( - + <> + + + ) } diff --git a/src/app/data/pontusx-account-names.ts b/src/app/data/pontusx-account-names.ts index 4459e83bd..56f36bdfe 100644 --- a/src/app/data/pontusx-account-names.ts +++ b/src/app/data/pontusx-account-names.ts @@ -1,5 +1,7 @@ import axios from 'axios' import { useQuery } from '@tanstack/react-query' +import type { AccountNameInfo } from '../hooks/useAccountName' +import * as process from 'process' const DATA_SOURCE_URL = 'https://raw.githubusercontent.com/deltaDAO/mvg-portal/main/pontusxAddresses.json' @@ -41,3 +43,23 @@ export const usePontusXAccountNames = (enabled: boolean) => { staleTime: Infinity, }) } + +export const usePontusXAccountName = (address: string, enabled: boolean): AccountNameInfo => { + // When running jest tests, we don't want to load from Pontus-X. + if (process.env.NODE_ENV === 'test') { + return { + name: undefined, + loading: false, + } + } + // This is not a condition that can change while the app is running, so it's OK. + // eslint-disable-next-line react-hooks/rules-of-hooks + const { isLoading, error, data: allNames } = usePontusXAccountNames(enabled) + if (error) { + console.log('Failed to load Pontus-X account names', error) + } + return { + name: allNames?.map.get(address), + loading: isLoading, + } +} diff --git a/src/app/hooks/useAccountName.ts b/src/app/hooks/useAccountName.ts new file mode 100644 index 000000000..20e052bed --- /dev/null +++ b/src/app/hooks/useAccountName.ts @@ -0,0 +1,61 @@ +import { SearchScope } from '../../types/searchScope' +import Chance from 'chance' +import { Layer } from '../../oasis-nexus/api' +import { usePontusXAccountName } from '../data/pontusx-account-names' + +const NO_MATCH = '__no_match__' + +export type AccountNameInfo = { + name: string | undefined + loading: boolean +} + +/** + * Do we want to see some random names? + */ +const DEBUG_MODE = true + +/** + * Look up the name of an account. + */ +const lookupName = (scope: SearchScope, _address: string): string | undefined => { + switch (scope.layer) { + // TODO: look up the data + default: + // If debug mode is on, return mock names in ~50% of the cases, no nome otherwise + return DEBUG_MODE && Math.random() < 0.5 ? new Chance().name() : undefined + } +} + +const nameCache: Map = new Map() + +/** + * Find out the name of an account + * + * This is the entry point that should be used by the application, + * since this function also includes caching. + */ +export const useAccountName = (scope: SearchScope, address: string, dropCache = false): AccountNameInfo => { + const isPontusX = scope.layer === Layer.pontusx + + const pontusXName = usePontusXAccountName(address, isPontusX) + if (isPontusX) return pontusXName + + const key = `${scope.network}.${scope.layer}.${address}` + + if (dropCache) nameCache.delete(key) + const hasMatch = nameCache.has(key) + if (hasMatch) { + const cachedName = nameCache.get(key) + return { + name: cachedName === NO_MATCH ? undefined : cachedName, + loading: false, + } + } + const name = lookupName(scope, address) + nameCache.set(key, name ?? NO_MATCH) + return { + name, + loading: false, + } +} From 7c21f871bbde686527cbe7674658c1dbfbc0a8fe Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Fri, 23 Feb 2024 17:50:13 +0100 Subject: [PATCH 13/20] Support for searching for accounts by name --- src/app/components/Search/search-utils.ts | 5 +++ src/app/data/pontusx-account-names.ts | 29 +++++++++++++++++ src/app/hooks/useAccountName.ts | 13 +++++++- .../DeferredConsensusAccountDetails.tsx | 20 ++++++++++++ .../DeferredRuntimeAccountDetails.tsx | 27 ++++++++++++++++ .../SearchResultsPage/SearchResultsList.tsx | 31 ++++++++++++++++++ src/app/pages/SearchResultsPage/hooks.ts | 32 ++++++++++++++++++- .../useRedirectIfSingleResult.ts | 3 ++ 8 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx create mode 100644 src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx diff --git a/src/app/components/Search/search-utils.ts b/src/app/components/Search/search-utils.ts index 752c2fc78..c097b1eee 100644 --- a/src/app/components/Search/search-utils.ts +++ b/src/app/components/Search/search-utils.ts @@ -112,6 +112,11 @@ export const validateAndNormalize = { return searchTerm.toLowerCase() } }, + accountNameFragment: (searchTerm: string) => { + if (searchTerm?.length >= textSearchMininumLength) { + return searchTerm.toLowerCase() + } + }, } satisfies { [name: string]: (searchTerm: string) => string | undefined } export function isSearchValid(searchTerm: string) { diff --git a/src/app/data/pontusx-account-names.ts b/src/app/data/pontusx-account-names.ts index 56f36bdfe..b5474f0c9 100644 --- a/src/app/data/pontusx-account-names.ts +++ b/src/app/data/pontusx-account-names.ts @@ -1,6 +1,9 @@ import axios from 'axios' import { useQuery } from '@tanstack/react-query' import type { AccountNameInfo } from '../hooks/useAccountName' +import { Layer } from '../../oasis-nexus/api' +import { Network } from '../../types/network' +import { findTextMatch } from '../components/HighlightedText/text-matching' import * as process from 'process' const DATA_SOURCE_URL = 'https://raw.githubusercontent.com/deltaDAO/mvg-portal/main/pontusxAddresses.json' @@ -63,3 +66,29 @@ export const usePontusXAccountName = (address: string, enabled: boolean): Accoun loading: isLoading, } } + +export const useSearchForPontusXAccountsByName = ( + network: Network, + nameFragment: string, + enabled: boolean, +) => { + const { isLoading, error, data: allNames } = usePontusXAccountNames(enabled) + if (error) { + console.log('Failed to load Pontus-X account names', error) + } + + const textMatcher = + nameFragment && enabled + ? (entry: AccountEntry): boolean => { + return !!findTextMatch(entry.name, [nameFragment]) + } + : () => false + return { + results: (allNames?.list || []).filter(textMatcher).map(entry => ({ + network, + layer: Layer.pontusx, + address: entry.address, + })), + isLoading, + } +} diff --git a/src/app/hooks/useAccountName.ts b/src/app/hooks/useAccountName.ts index 20e052bed..fe7a95ea7 100644 --- a/src/app/hooks/useAccountName.ts +++ b/src/app/hooks/useAccountName.ts @@ -1,7 +1,7 @@ import { SearchScope } from '../../types/searchScope' import Chance from 'chance' import { Layer } from '../../oasis-nexus/api' -import { usePontusXAccountName } from '../data/pontusx-account-names' +import { usePontusXAccountName, useSearchForPontusXAccountsByName } from '../data/pontusx-account-names' const NO_MATCH = '__no_match__' @@ -59,3 +59,14 @@ export const useAccountName = (scope: SearchScope, address: string, dropCache = loading: false, } } + +export const useSearchForAccountsByName = (scope: SearchScope, nameFragment = '') => { + const isValidPontusXSearch = scope.layer === Layer.pontusx && !!nameFragment + const pontusXResults = useSearchForPontusXAccountsByName(scope.network, nameFragment, isValidPontusXSearch) + return isValidPontusXSearch + ? pontusXResults + : { + isLoading: false, + results: [], + } +} diff --git a/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx b/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx new file mode 100644 index 000000000..b3e3ee690 --- /dev/null +++ b/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx @@ -0,0 +1,20 @@ +import { FC } from 'react' +import { AllTokenPrices } from '../../../coin-gecko/api' +import { Network } from '../../../types/network' + +/** + * Load and display details of a RuntimeAccount + */ +export const DeferredConsensusAccountDetails: FC<{ + network: Network + address: string + tokenPrices: AllTokenPrices + showLayer?: boolean +}> = () => + // { + // network, address, tokenPrices, highlightedPartOfName, showLayer + // }, + { + // TODO: load and display consensus account details when API and component becomes available + return null + } diff --git a/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx b/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx new file mode 100644 index 000000000..e00cdd468 --- /dev/null +++ b/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx @@ -0,0 +1,27 @@ +import { FC } from 'react' +import { Runtime, useGetRuntimeAccountsAddress } from '../../../oasis-nexus/api' +import { AllTokenPrices } from '../../../coin-gecko/api' +import { AccountDetailsView } from './AccountDetailsView' +import { Network } from '../../../types/network' + +/** + * Load and display details of a RuntimeAccount + */ +export const DeferredRuntimeAccountDetails: FC<{ + network: Network + layer: Runtime + address: string + tokenPrices: AllTokenPrices + showLayer?: boolean +}> = ({ network, layer, address, tokenPrices, showLayer }) => { + const { data, isLoading, isError } = useGetRuntimeAccountsAddress(network, layer, address) + return ( + + ) +} diff --git a/src/app/pages/SearchResultsPage/SearchResultsList.tsx b/src/app/pages/SearchResultsPage/SearchResultsList.tsx index 366259b74..bf3eecd5d 100644 --- a/src/app/pages/SearchResultsPage/SearchResultsList.tsx +++ b/src/app/pages/SearchResultsPage/SearchResultsList.tsx @@ -7,6 +7,7 @@ import { RuntimeTransactionDetailView } from '../RuntimeTransactionDetailPage' import { AccountDetailsView } from '../AccountDetailsPage/AccountDetailsView' import { AccountResult, + AccountAddressResult, BlockResult, ContractResult, ProposalResult, @@ -21,6 +22,9 @@ import { AllTokenPrices } from '../../../coin-gecko/api' import { ResultListFrame } from './ResultListFrame' import { TokenDetails } from '../../components/Tokens/TokenDetails' import { ProposalDetailView } from '../ProposalDetailsPage' +import { DeferredRuntimeAccountDetails } from '../AccountDetailsPage/DeferredRuntimeAccountDetails' +import { Layer } from '../../../oasis-nexus/api' +import { DeferredConsensusAccountDetails } from '../AccountDetailsPage/DeferredConsensusAccountDetails' /** * Component for displaying a list of search results @@ -94,6 +98,33 @@ export const SearchResultsList: FC<{ linkLabel={t('search.results.accounts.viewLink')} /> + item.resultType === 'accountAddress', + )} + resultComponent={item => + item.layer === Layer.consensus ? ( + + ) : ( + + ) + } + link={acc => RouteUtils.getAccountRoute(acc, acc.address)} + linkLabel={t('search.results.accounts.viewLink')} + /> + item.resultType === 'contract')} diff --git a/src/app/pages/SearchResultsPage/hooks.ts b/src/app/pages/SearchResultsPage/hooks.ts index 395a96cbf..b5450202e 100644 --- a/src/app/pages/SearchResultsPage/hooks.ts +++ b/src/app/pages/SearchResultsPage/hooks.ts @@ -19,6 +19,7 @@ import { import { RouteUtils } from '../../utils/route-utils' import { SearchParams } from '../../components/Search/search-utils' import { SearchScope } from '../../../types/searchScope' +import { useSearchForAccountsByName } from '../../hooks/useAccountName' function isDefined(item: T): item is NonNullable { return item != null @@ -27,7 +28,7 @@ function isDefined(item: T): item is NonNullable { export type ConditionalResults = { isLoading: boolean; results: T[] } type SearchResultItemCore = HasScope & { - resultType: 'block' | 'transaction' | 'account' | 'contract' | 'token' | 'proposal' + resultType: 'block' | 'transaction' | 'account' | 'accountAddress' | 'contract' | 'token' | 'proposal' } export type BlockResult = SearchResultItemCore & RuntimeBlock & { resultType: 'block' } @@ -36,6 +37,10 @@ export type TransactionResult = SearchResultItemCore & RuntimeTransaction & { re export type AccountResult = SearchResultItemCore & RuntimeAccount & { resultType: 'account' } +export type AccountAddressResult = SearchResultItemCore & { address: string } & { + resultType: 'accountAddress' +} + export type ContractResult = SearchResultItemCore & RuntimeAccount & { resultType: 'contract' } export type TokenResult = SearchResultItemCore & EvmToken & { resultType: 'token' } @@ -46,6 +51,7 @@ export type SearchResultItem = | BlockResult | TransactionResult | AccountResult + | AccountAddressResult | ContractResult | TokenResult | ProposalResult @@ -193,6 +199,25 @@ export function useNetworkProposalsConditionally( } } +type AccountAddressInfo = Pick + +export function useNamedAccountConditionally( + currentScope: SearchScope | undefined, + nameFragment: string | undefined, +): ConditionalResults { + const queries = RouteUtils.getVisibleScopes(currentScope).map(scope => + // eslint-disable-next-line react-hooks/rules-of-hooks + useSearchForAccountsByName(scope, nameFragment), + ) + return { + isLoading: queries.some(query => query.isLoading), + results: queries + .map(query => query.results) + .filter(isDefined) + .flat(), + } +} + export const useSearch = (currentScope: SearchScope | undefined, q: SearchParams) => { const queries = { blockHeight: useBlocksByHeightConditionally(currentScope, q.blockHeight), @@ -201,6 +226,7 @@ export const useSearch = (currentScope: SearchScope | undefined, q: SearchParams oasisAccount: useRuntimeAccountConditionally(currentScope, q.consensusAccount), // TODO: remove evmBech32Account and use evmAccount when API is ready evmBech32Account: useRuntimeAccountConditionally(currentScope, q.evmBech32Account), + accountsByName: useNamedAccountConditionally(currentScope, q.accountNameFragment), tokens: useRuntimeTokenConditionally(currentScope, q.evmTokenNameFragment), proposals: useNetworkProposalsConditionally(q.networkProposalNameFragment), } @@ -211,6 +237,7 @@ export const useSearch = (currentScope: SearchScope | undefined, q: SearchParams ...(queries.oasisAccount.results || []), ...(queries.evmBech32Account.results || []), ].filter(isAccountNonEmpty) + const accountAddresses = queries.accountsByName.results || [] const tokens = queries.tokens.results .map(l => l.evm_tokens) .flat() @@ -228,6 +255,9 @@ export const useSearch = (currentScope: SearchScope | undefined, q: SearchParams ...accounts .filter(account => account.evm_contract) .map((account): ContractResult => ({ ...account, resultType: 'contract' })), + ...accountAddresses.map( + (account): AccountAddressResult => ({ ...account, resultType: 'accountAddress' }), + ), ...tokens.map((token): TokenResult => ({ ...token, resultType: 'token' })), ...proposals.map((proposal): ProposalResult => ({ ...proposal, resultType: 'proposal' })), ] diff --git a/src/app/pages/SearchResultsPage/useRedirectIfSingleResult.ts b/src/app/pages/SearchResultsPage/useRedirectIfSingleResult.ts index ebcb816b8..e3e704e02 100644 --- a/src/app/pages/SearchResultsPage/useRedirectIfSingleResult.ts +++ b/src/app/pages/SearchResultsPage/useRedirectIfSingleResult.ts @@ -35,6 +35,9 @@ export function useRedirectIfSingleResult( case 'account': redirectTo = RouteUtils.getAccountRoute(item, item.address_eth ?? item.address) break + case 'accountAddress': + redirectTo = `${RouteUtils.getAccountRoute(item, item.address)}?q=${searchTerm}` + break case 'contract': redirectTo = RouteUtils.getAccountRoute(item, item.address_eth ?? item.address) break From 898e8031f3951e3ad3d93e27c7bfbac292eaf78d Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Sun, 11 Feb 2024 19:05:11 +0100 Subject: [PATCH 14/20] Implement highlighting matches in account names --- .changelog/1246.feature.md | 1 + src/app/components/Account/AccountLink.tsx | 17 ++++++++++++++--- src/app/components/Account/index.tsx | 12 ++++++++++-- .../AccountDetailsPage/AccountDetailsCard.tsx | 3 +++ .../AccountDetailsPage/AccountDetailsView.tsx | 4 +++- .../DeferredConsensusAccountDetails.tsx | 1 + .../DeferredRuntimeAccountDetails.tsx | 4 +++- src/app/pages/AccountDetailsPage/index.tsx | 3 ++- .../SearchResultsPage/SearchResultsList.tsx | 2 ++ 9 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 .changelog/1246.feature.md diff --git a/.changelog/1246.feature.md b/.changelog/1246.feature.md new file mode 100644 index 000000000..fba6defd8 --- /dev/null +++ b/.changelog/1246.feature.md @@ -0,0 +1 @@ +Initial support for displaying account names diff --git a/src/app/components/Account/AccountLink.tsx b/src/app/components/Account/AccountLink.tsx index f1f1ab53b..abdaa10d0 100644 --- a/src/app/components/Account/AccountLink.tsx +++ b/src/app/components/Account/AccountLink.tsx @@ -11,6 +11,8 @@ import { useAccountName } from '../../hooks/useAccountName' import { trimLongString } from '../../utils/trimLongString' import { MaybeWithTooltip } from '../AdaptiveTrimmer/MaybeWithTooltip' import Box from '@mui/material/Box' +import { HighlightedText } from '../HighlightedText' +import { AdaptiveHighlightedText } from '../HighlightedText/AdaptiveHighlightedText' import { AdaptiveTrimmer } from '../AdaptiveTrimmer/AdaptiveTrimmer' const WithTypographyAndLink: FC<{ @@ -60,13 +62,18 @@ export const AccountLink: FC<{ */ plain?: boolean + /** + * What part of the name should be highlighted (if any) + */ + highlightedPartOfName?: string | undefined + /** * Any extra tooltips to display * * (Besides the content necessary because of potential shortening) */ extraTooltip?: ReactNode -}> = ({ scope, address, alwaysTrim, plain, extraTooltip }) => { +}> = ({ scope, address, alwaysTrim, plain, highlightedPartOfName, extraTooltip }) => { const { isTablet } = useScreenSize() const { name: accountName } = useAccountName(scope, address) const to = RouteUtils.getAccountRoute(scope, address) @@ -112,7 +119,7 @@ export const AccountLink: FC<{ {accountName ? ( - {accountName} ({address}) + ({address}) ) : ( address @@ -128,7 +135,11 @@ export const AccountLink: FC<{ return ( <> - + diff --git a/src/app/components/Account/index.tsx b/src/app/components/Account/index.tsx index 71bca39d4..f614ea69e 100644 --- a/src/app/components/Account/index.tsx +++ b/src/app/components/Account/index.tsx @@ -30,9 +30,17 @@ type AccountProps = { isLoading: boolean tokenPrices: AllTokenPrices showLayer?: boolean + highlightedPartOfName: string | undefined } -export const Account: FC = ({ account, token, isLoading, tokenPrices, showLayer }) => { +export const Account: FC = ({ + account, + token, + isLoading, + tokenPrices, + showLayer, + highlightedPartOfName, +}) => { const { t } = useTranslation() const { isMobile } = useScreenSize() const address = account ? account.address_eth ?? account.address : undefined @@ -67,7 +75,7 @@ export const Account: FC = ({ account, token, isLoading, tokenPric
- +
diff --git a/src/app/pages/AccountDetailsPage/AccountDetailsCard.tsx b/src/app/pages/AccountDetailsPage/AccountDetailsCard.tsx index 23bfe2975..6f81242fe 100644 --- a/src/app/pages/AccountDetailsPage/AccountDetailsCard.tsx +++ b/src/app/pages/AccountDetailsPage/AccountDetailsCard.tsx @@ -12,6 +12,7 @@ type AccountDetailsProps = { account: RuntimeAccount | undefined token: EvmToken | undefined tokenPrices: AllTokenPrices + highlightedPartOfName?: string | undefined } export const AccountDetailsCard: FC = ({ @@ -21,6 +22,7 @@ export const AccountDetailsCard: FC = ({ account, token, tokenPrices, + highlightedPartOfName, }) => { const { t } = useTranslation() return ( @@ -35,6 +37,7 @@ export const AccountDetailsCard: FC = ({ account={account} token={token} tokenPrices={tokenPrices} + highlightedPartOfName={highlightedPartOfName} /> ) diff --git a/src/app/pages/AccountDetailsPage/AccountDetailsView.tsx b/src/app/pages/AccountDetailsPage/AccountDetailsView.tsx index 0c9f70225..4e94e2a4d 100644 --- a/src/app/pages/AccountDetailsPage/AccountDetailsView.tsx +++ b/src/app/pages/AccountDetailsPage/AccountDetailsView.tsx @@ -12,7 +12,8 @@ export const AccountDetailsView: FC<{ token?: EvmToken tokenPrices: AllTokenPrices showLayer?: boolean -}> = ({ isLoading, isError, account, token, tokenPrices, showLayer }) => { + highlightedPartOfName?: string | undefined +}> = ({ isLoading, isError, account, token, tokenPrices, showLayer, highlightedPartOfName }) => { const { t } = useTranslation() return isError ? ( @@ -23,6 +24,7 @@ export const AccountDetailsView: FC<{ isLoading={isLoading} tokenPrices={tokenPrices} showLayer={showLayer} + highlightedPartOfName={highlightedPartOfName} /> ) } diff --git a/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx b/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx index b3e3ee690..5720b4ecd 100644 --- a/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx +++ b/src/app/pages/AccountDetailsPage/DeferredConsensusAccountDetails.tsx @@ -9,6 +9,7 @@ export const DeferredConsensusAccountDetails: FC<{ network: Network address: string tokenPrices: AllTokenPrices + highlightedPartOfName: string | undefined showLayer?: boolean }> = () => // { diff --git a/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx b/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx index e00cdd468..882f742cc 100644 --- a/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx +++ b/src/app/pages/AccountDetailsPage/DeferredRuntimeAccountDetails.tsx @@ -12,8 +12,9 @@ export const DeferredRuntimeAccountDetails: FC<{ layer: Runtime address: string tokenPrices: AllTokenPrices + highlightedPartOfName: string | undefined showLayer?: boolean -}> = ({ network, layer, address, tokenPrices, showLayer }) => { +}> = ({ network, layer, address, tokenPrices, highlightedPartOfName, showLayer }) => { const { data, isLoading, isError } = useGetRuntimeAccountsAddress(network, layer, address) return ( ) } diff --git a/src/app/pages/AccountDetailsPage/index.tsx b/src/app/pages/AccountDetailsPage/index.tsx index 41dbb7e93..2c9c5810e 100644 --- a/src/app/pages/AccountDetailsPage/index.tsx +++ b/src/app/pages/AccountDetailsPage/index.tsx @@ -32,7 +32,7 @@ export const AccountDetailsPage: FC = () => { const { t } = useTranslation() const scope = useRequiredScopeParam() - const { address } = useLoaderData() as AddressLoaderData + const { address, searchTerm } = useLoaderData() as AddressLoaderData const { account, isLoading: isAccountLoading, isError } = useAccount(scope, address) const isContract = !!account?.evm_contract const { token, isLoading: isTokenLoading } = useTokenInfo(scope, address, isContract) @@ -62,6 +62,7 @@ export const AccountDetailsPage: FC = () => { account={account} token={token} tokenPrices={tokenPrices} + highlightedPartOfName={searchTerm} /> ) : ( @@ -117,6 +118,7 @@ export const SearchResultsList: FC<{ layer={item.layer} address={item.address} tokenPrices={tokenPrices} + highlightedPartOfName={searchTerm} showLayer={true} /> ) From 14faeff919b9890e3884447a28fa7d8c296b332e Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Sun, 11 Feb 2024 19:46:46 +0100 Subject: [PATCH 15/20] Apply configuration and branding for Pontus-X Explorer --- .env | 38 ++++++++++----------- .env.production | 38 ++++++++++----------- public/pontusx-og-image.jpg | Bin 0 -> 76898 bytes public/pontusx.webmanifest | 26 ++++++++++++++ public/pontusx/apple-touch.png | Bin 0 -> 18983 bytes public/pontusx/favicon-16x16.png | Bin 0 -> 638 bytes public/pontusx/favicon-32x32.png | Bin 0 -> 1692 bytes public/pontusx/favicon.ico | Bin 0 -> 15406 bytes public/pontusx/logo192.png | Bin 0 -> 14428 bytes public/pontusx/logo512.png | Bin 0 -> 39759 bytes public/pontusx/logo_blue.svg | 1 + public/pontusx/logo_only_blue.svg | 15 ++++++++ public/pontusx/logo_only_white.svg | 15 ++++++++ public/pontusx/logo_white.svg | 1 + src/app/components/CustomIcons/pontusx.svg | 7 ++++ src/app/components/PageLayout/Logotype.tsx | 4 +-- 16 files changed, 105 insertions(+), 40 deletions(-) create mode 100644 public/pontusx-og-image.jpg create mode 100644 public/pontusx.webmanifest create mode 100644 public/pontusx/apple-touch.png create mode 100644 public/pontusx/favicon-16x16.png create mode 100644 public/pontusx/favicon-32x32.png create mode 100644 public/pontusx/favicon.ico create mode 100644 public/pontusx/logo192.png create mode 100644 public/pontusx/logo512.png create mode 100644 public/pontusx/logo_blue.svg create mode 100644 public/pontusx/logo_only_blue.svg create mode 100644 public/pontusx/logo_only_white.svg create mode 100644 public/pontusx/logo_white.svg create mode 100644 src/app/components/CustomIcons/pontusx.svg diff --git a/.env b/.env index fe601435e..bd657b668 100644 --- a/.env +++ b/.env @@ -6,23 +6,23 @@ REACT_APP_BUILD_VERSION= # REACT_APP_TESTNET_API=https://testnet.nexus.stg.oasis.io/v1/ REACT_APP_API=https://nexus.oasis.io/v1/ REACT_APP_TESTNET_API=https://testnet.nexus.oasis.io/v1/ -REACT_APP_META_TITLE=Oasis Explorer -REACT_APP_META_IMAGE=oasis-og-image.jpg -REACT_APP_META_MANIFEST=app.webmanifest -REACT_APP_META_FAVICON=favicon.ico -REACT_APP_META_APPLE_ICON=logo192.png -REACT_APP_META_DESC=Official explorer for the Oasis Network. -REACT_APP_SOCIAL_TELEGRAM=https://t.me/oasisprotocolcommunity -REACT_APP_SOCIAL_TWITTER=https://twitter.com/oasisprotocol -REACT_APP_SOCIAL_DISCORD=https://oasis.io/discord -REACT_APP_SOCIAL_YOUTUBE=https://www.youtube.com/channel/UC35UFPcZ2F1wjPxhPrSsESQ -REACT_APP_SOCIAL_REDDIT=https://www.reddit.com/r/oasisnetwork/ -# REACT_APP_SOCIAL_LINKEDIN=https://www.linkedin.com/company/oasisprotocol -# REACT_APP_SOCIAL_DOCS=https://oasisprotocol.org/developers#overview -# REACT_APP_SOCIAL_HOME=https://oasisprotocol.org/ -REACT_APP_PRODUCTION_URLS=https://explorer.oasis.io, https://explorer.prd.oasis.io -REACT_APP_STAGING_URLS=https://explorer.stg.oasis.io -REACT_APP_SHOW_BUILD_BANNERS=true +REACT_APP_META_TITLE=Pontus-X Explorer +REACT_APP_META_IMAGE=pontusx-og-image.jpg +REACT_APP_META_MANIFEST=pontusx.webmanifest +REACT_APP_META_FAVICON=pontusx/favicon.ico +REACT_APP_META_APPLE_ICON=pontusx/logo192.png +REACT_APP_META_DESC=Official explorer for the Pontus-X Network. +# REACT_APP_SOCIAL_TELEGRAM=https://t.me/oasisprotocolcommunity +# REACT_APP_SOCIAL_TWITTER=https://twitter.com/oasisprotocol +# REACT_APP_SOCIAL_DISCORD=https://oasis.io/discord +# REACT_APP_SOCIAL_YOUTUBE=https://www.youtube.com/channel/UC35UFPcZ2F1wjPxhPrSsESQ +# REACT_APP_SOCIAL_REDDIT=https://www.reddit.com/r/oasisnetwork/ +REACT_APP_SOCIAL_LINKEDIN=https://www.linkedin.com/company/76729586 +REACT_APP_SOCIAL_DOCS=https://docs.pontus-x.eu/ +REACT_APP_SOCIAL_HOME=https://www.pontus-x.eu/ +#REACT_APP_PRODUCTION_URLS=https://explorer.oasis.io, https://explorer.prd.oasis.io +#REACT_APP_STAGING_URLS=https://explorer.stg.oasis.io +REACT_APP_SHOW_BUILD_BANNERS=false # REACT_APP_FIXED_NETWORK=testnet -# REACT_APP_FIXED_LAYER=sapphire -REACT_APP_SHOW_FIAT_VALUES=true +REACT_APP_FIXED_LAYER=pontusx +REACT_APP_SHOW_FIAT_VALUES=false diff --git a/.env.production b/.env.production index 160a2da18..1a635e908 100644 --- a/.env.production +++ b/.env.production @@ -1,23 +1,23 @@ REACT_APP_BUILD_DATETIME= REACT_APP_BUILD_SHA= REACT_APP_BUILD_VERSION= -REACT_APP_META_TITLE=Oasis Explorer -REACT_APP_META_IMAGE=oasis-og-image.jpg -REACT_APP_META_MANIFEST=app.webmanifest -REACT_APP_META_FAVICON=favicon.ico -REACT_APP_META_APPLE_ICON=logo192.png -REACT_APP_META_DESC=Official explorer for the Oasis Network. -REACT_APP_SOCIAL_TELEGRAM=https://t.me/oasisprotocolcommunity -REACT_APP_SOCIAL_TWITTER=https://twitter.com/oasisprotocol -REACT_APP_SOCIAL_DISCORD=https://oasis.io/discord -REACT_APP_SOCIAL_YOUTUBE=https://www.youtube.com/channel/UC35UFPcZ2F1wjPxhPrSsESQ -REACT_APP_SOCIAL_REDDIT=https://www.reddit.com/r/oasisnetwork/ -# REACT_APP_SOCIAL_LINKEDIN=https://www.linkedin.com/company/oasisprotocol -# REACT_APP_SOCIAL_DOCS=https://oasisprotocol.org/developers#overview -# REACT_APP_SOCIAL_HOME=https://oasisprotocol.org/ -REACT_APP_PRODUCTION_URLS=https://explorer.oasis.io, https://explorer.prd.oasis.io -REACT_APP_STAGING_URLS=https://explorer.stg.oasis.io -REACT_APP_SHOW_BUILD_BANNERS=true +REACT_APP_META_TITLE=Pontus-X Explorer +REACT_APP_META_IMAGE=pontusx-og-image.jpg +REACT_APP_META_MANIFEST=pontusx.webmanifest +REACT_APP_META_FAVICON=pontusx/favicon.ico +REACT_APP_META_APPLE_ICON=pontusx/logo192.png +REACT_APP_META_DESC=Official explorer for the Pontus-X Network. +# REACT_APP_SOCIAL_TELEGRAM=https://t.me/oasisprotocolcommunity +# REACT_APP_SOCIAL_TWITTER=https://twitter.com/oasisprotocol +# REACT_APP_SOCIAL_DISCORD=https://oasis.io/discord +# REACT_APP_SOCIAL_YOUTUBE=https://www.youtube.com/channel/UC35UFPcZ2F1wjPxhPrSsESQ +# REACT_APP_SOCIAL_REDDIT=https://www.reddit.com/r/oasisnetwork/ +REACT_APP_SOCIAL_LINKEDIN=https://www.linkedin.com/company/76729586 +REACT_APP_SOCIAL_DOCS=https://docs.pontus-x.eu/ +REACT_APP_SOCIAL_HOME=https://www.pontus-x.eu/ +# REACT_APP_PRODUCTION_URLS=https://explorer.oasis.io, https://explorer.prd.oasis.io +# REACT_APP_STAGING_URLS=https://explorer.stg.oasis.io +REACT_APP_SHOW_BUILD_BANNERS=false # REACT_APP_FIXED_NETWORK=testnet -# REACT_APP_FIXED_LAYER=sapphire -REACT_APP_SHOW_FIAT_VALUES=true +REACT_APP_FIXED_LAYER=pontusx +REACT_APP_SHOW_FIAT_VALUES=false diff --git a/public/pontusx-og-image.jpg b/public/pontusx-og-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3eebcb95f3b9e6824a990080a802fde282d3009f GIT binary patch literal 76898 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

=sEB1I!5-Fe+x|M&!Zb}JVXcE*%8GBg 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 AGZ%U(bzLPUuAcbn0wg&|X{ZG6`3X!=Bm6Ldk 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 literal 0 HcmV?d00001 diff --git a/public/pontusx.webmanifest b/public/pontusx.webmanifest new file mode 100644 index 000000000..b8812a83e --- /dev/null +++ b/public/pontusx.webmanifest @@ -0,0 +1,26 @@ +{ + "$schema": "https://json.schemastore.org/web-manifest-combined.json", + "short_name": "Pontus-X Explorer", + "name": "Official explorer for the Pontus-X Network.", + "icons": [ + { + "src": "./pontusx/favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "./pontusx/logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "./pontusx/logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/public/pontusx/apple-touch.png b/public/pontusx/apple-touch.png new file mode 100644 index 0000000000000000000000000000000000000000..aa467c6b310d8051e2de75281ab7b38fa717829f GIT binary patch literal 18983 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 Y-?RMG5g>F|8UO$Q07*qoM6N<$f-r?H6aWAK literal 0 HcmV?d00001 diff --git a/public/pontusx/favicon-32x32.png b/public/pontusx/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..879e4a58e11799d927d4af541aaf9d89a82f8968 GIT binary patch literal 1692 zcmV;N24ne&P)0}bpk~4`GO-6>dNFUjmATb7fbjW$Ttr}w^%B|Goml1j{Q>D1 zK>zXG)Fm+;=6hf?L-M~UYHPNj?MpB{m-Q!@|5G#$(EN1HPnOjhzE^O51n+Oko0F8V zH*=>TFLk??&(7`(sAB->x|n1i<%caq}oh_0*z*GGXQoX_zVc2 zQ&Ynvr8C#Fo&oLi^2{2}9xDkQ&-s((0jSPY;_JrH+}2K4JU&yt9WMpd>>Z3orvVJ` z_B}pWNrS^+G+`XLcz9L0>|&)3xC0uLQI_-b0RLfm0BR>4FXdBcnZWmpxcn$qY>}5( z2?NebkI^&*CXN;EYGZ8I%G*^XzXGdym&!NJB2vuTsiwJKmjl3H#&r;$3i_!k?0HJD z0~^tFmV(?{?LnBe(72#Hy~Ox472=hO<(+#jQ#LkKN&hx1b1O=$!2$#K51?rN6(#>K zN4q)t-FshM0$dWzQQ!k2z6uxgY0u1TP&TMkl1y>Jf6ot7MZA_cxE4Bs7DxI1Ia;ys zgXq1#24On$1O($C&*0BZ^6YBNe6^D1MHK*HG+REd@N#V+tTrl^t5lF2$=xxb@UC&9 z-%KNRPDP&<|;qx01cCX`50${P`4Coy%)~2VL=NDzP5wS{N)t#(+hSjjr z#Yf=bQYiXRbW|r(SSBUt1H!DqAy}#;Jh&c9-S-#X3TweNC5bPSQ5iKY+OZFSNb#{+ zhTj%KFeoB@Dd?x7#BgE)bLZa%@JF2I(Y&7$1?RGPfPNVekMg~slp%Zq0?)e~+6zN| z)=nW7plLM|tE#$FV6Y0q9abW8X1k#cfZc+|-P!w6ySz$O1g4U_0N^b^o){5MyOz_|1*TK~sA#wBAPwuu0*I`=8yLM{I-!L8bC_3R-Vvd2 zmug*-#EAV#{_Z6dD+gkxviTO2aCM|_Q6APY_LndvWq&~U(GhSROhh%A#q7G~Ge~*6 zjc%}si<_8y2J;=onJY3wTk|{|NGP`sL>v$<;H-HAFqCc6mpXDRNqhq9*ExHfG_3n) z0B+2Z*8=k02z#3E;WU=XN+wA)jnJ;b`K`kData%fcOCJ_9DqCIf>Eynf{q$CD-_a! zd}&DS$G48!F}Iet}2%oCA0|gE@ z8#z55;p-6IZ{K?z&jZ!<{pFG0zTTmWQIdn9%EgB(8Rq%@txT+)MdlcoPi_N2*;e62 zIS>IRkL8w8+|EIvt!kR@(ze~xF@Va6eH8axL?tg|b z7XUVt^LP2i0ChI+YiiyxR_X4HWENnq1)Ch_q$iIt^#E}FpbQHPnb1o?>=h_~RV;q3 z3I%3Af=K!bU(bcvMF{+YYPlXE?9=gF#JjOf*15yA>ObVi&cv1T$OIpYT&m?yZZ8kO zzEsr{PovXKM|cgwqi%a2QjhnnNL-K+rWya=p_T?W*!<&D-dMhuMb(58Y00hxy8**R z^xjx-bKu7SByN}+S{gR*Pw?LJe+MASwI)-ITbjeIzzk5!{CCS08l~$z0LLX=?~0R8 mdbxP%)brl}bV_9VOMe2GtzN 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 TD!R~fX8?I=C8=5olaT)bEe`_Q literal 0 HcmV?d00001 diff --git a/public/pontusx/logo512.png b/public/pontusx/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..88006d2a7df6bf78c3d3271527856f94cf673211 GIT binary patch literal 39759 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 literal 0 HcmV?d00001 diff --git a/public/pontusx/logo_blue.svg b/public/pontusx/logo_blue.svg new file mode 100644 index 000000000..986b51129 --- /dev/null +++ b/public/pontusx/logo_blue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/pontusx/logo_only_blue.svg b/public/pontusx/logo_only_blue.svg new file mode 100644 index 000000000..873ccc556 --- /dev/null +++ b/public/pontusx/logo_only_blue.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/pontusx/logo_only_white.svg b/public/pontusx/logo_only_white.svg new file mode 100644 index 000000000..e5d7441ad --- /dev/null +++ b/public/pontusx/logo_only_white.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/public/pontusx/logo_white.svg b/public/pontusx/logo_white.svg new file mode 100644 index 000000000..83e28864b --- /dev/null +++ b/public/pontusx/logo_white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/components/CustomIcons/pontusx.svg b/src/app/components/CustomIcons/pontusx.svg new file mode 100644 index 000000000..063e9756d --- /dev/null +++ b/src/app/components/CustomIcons/pontusx.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/app/components/PageLayout/Logotype.tsx b/src/app/components/PageLayout/Logotype.tsx index 1745e8b0a..e8726fdce 100644 --- a/src/app/components/PageLayout/Logotype.tsx +++ b/src/app/components/PageLayout/Logotype.tsx @@ -4,7 +4,7 @@ import { useScreenSize } from '../../hooks/useScreensize' import { useTheme } from '@mui/material/styles' import Box from '@mui/material/Box' import { Link as RouterLink } from 'react-router-dom' -import { OasisIcon } from '../CustomIcons/OasisIcon' +import pontusXIcon from '../CustomIcons/pontusx.svg' import Typography from '@mui/material/Typography' import { getAppTitle } from '../../../config' @@ -36,7 +36,7 @@ export const Logotype: FC = ({ color, showText }) => { color: color || theme.palette.layout.main, }} > - + Pontus-X logo {showText && ( {getAppTitle()} From 3deb6148d3a9828d33e1d2bca9a03e49330f9257 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Tue, 13 Feb 2024 20:16:44 +0100 Subject: [PATCH 16/20] Adjust Pontus-X dashboard - Hide the Tokens card - Tune TX list size --- .../ParatimeDashboardPage/LatestRuntimeTransactions.tsx | 3 +-- src/app/pages/ParatimeDashboardPage/index.tsx | 5 ++++- src/config.ts | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/app/pages/ParatimeDashboardPage/LatestRuntimeTransactions.tsx b/src/app/pages/ParatimeDashboardPage/LatestRuntimeTransactions.tsx index 74592c188..1d21d04b7 100644 --- a/src/app/pages/ParatimeDashboardPage/LatestRuntimeTransactions.tsx +++ b/src/app/pages/ParatimeDashboardPage/LatestRuntimeTransactions.tsx @@ -7,14 +7,13 @@ import { Link as RouterLink } from 'react-router-dom' import Link from '@mui/material/Link' import { Layer, useGetRuntimeTransactions } from '../../../oasis-nexus/api' import { RuntimeTransactions } from '../../components/Transactions' -import { NUMBER_OF_ITEMS_ON_DASHBOARD } from '../../config' import { COLORS } from '../../../styles/theme/colors' import { AppErrors } from '../../../types/errors' import { RouteUtils } from '../../utils/route-utils' import { useScreenSize } from '../../hooks/useScreensize' import { SearchScope } from '../../../types/searchScope' -const limit = NUMBER_OF_ITEMS_ON_DASHBOARD +const limit = 15 // NUMBER_OF_ITEMS_ON_DASHBOARD export const LatestRuntimeTransactions: FC<{ scope: SearchScope }> = ({ scope }) => { const { isTablet } = useScreenSize() diff --git a/src/app/pages/ParatimeDashboardPage/index.tsx b/src/app/pages/ParatimeDashboardPage/index.tsx index 53c73a6eb..a00a925cf 100644 --- a/src/app/pages/ParatimeDashboardPage/index.tsx +++ b/src/app/pages/ParatimeDashboardPage/index.tsx @@ -12,11 +12,14 @@ import { PageLayout } from '../../components/PageLayout' import { ParaTimeSnapshot } from './ParaTimeSnapshot' import { TopTokens } from './TopTokens' import { useRequiredScopeParam } from '../../hooks/useScopeParam' +import { paraTimesConfig } from '../../../config' export const ParatimeDashboardPage: FC = () => { const { isMobile } = useScreenSize() const scope = useRequiredScopeParam() + const { hideTokensFromDashboard } = paraTimesConfig[scope.layer]! + return ( @@ -35,7 +38,7 @@ export const ParatimeDashboardPage: FC = () => { )} - {!isMobile && } + {!hideTokensFromDashboard && !isMobile && } diff --git a/src/config.ts b/src/config.ts index b87fc4a5f..89d827b21 100644 --- a/src/config.ts +++ b/src/config.ts @@ -38,6 +38,8 @@ type LayerConfig = { * Specified in milliseconds. */ outOfDateThreshold: number + + hideTokensFromDashboard?: boolean } export enum RuntimeTypes { @@ -148,6 +150,7 @@ const pontusxConfig: LayerConfig = { decimals: 18, type: RuntimeTypes.Evm, outOfDateThreshold: 2 * 60 * 1000, + hideTokensFromDashboard: true, } type LayersConfig = { From 89a040f11cd9fa618a99b5f4661f5f85679e724b Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Tue, 13 Feb 2024 20:18:32 +0100 Subject: [PATCH 17/20] Update i18n texts - Update messaging about getting test tokens - Update messaging about social links --- src/locales/en/translation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 204d6e604..a4bf89c23 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -299,7 +299,7 @@ "last": "Last" }, "social": { - "description": "Be part of the community and stay in the loop on everything Oasis", + "description": "Learn more about Pontus-X and the team behind it", "discord": "Discord", "header": "Join us", "reddit": "Reddit", @@ -314,8 +314,8 @@ "changeView": "Change view" }, "testnetFaucet": { - "description": "Drops are limited to 10 TEST tokens", - "header": "Oasis Testnet Faucet", + "description": "Do you need some tokens for testing?", + "header": "Test tokens", "request": "Request test tokens" }, "tokens": { From 1a52fca371cdcba7574e7f7397f4627e83b472fc Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Wed, 28 Feb 2024 19:28:46 +0100 Subject: [PATCH 18/20] Add support for displaying privacy policy when required --- .env | 1 + .env.production | 1 + src/app/components/PageLayout/Footer.tsx | 9 +++++++++ src/app/pages/PrivacyPage/index.tsx | 17 +++++++++++++++++ src/config.ts | 2 ++ src/locales/en/translation.json | 3 +++ src/routes.tsx | 10 ++++++++++ src/types/global.d.ts | 1 + 8 files changed, 44 insertions(+) create mode 100644 src/app/pages/PrivacyPage/index.tsx diff --git a/.env b/.env index bd657b668..25501db65 100644 --- a/.env +++ b/.env @@ -26,3 +26,4 @@ REACT_APP_SHOW_BUILD_BANNERS=false # REACT_APP_FIXED_NETWORK=testnet REACT_APP_FIXED_LAYER=pontusx REACT_APP_SHOW_FIAT_VALUES=false +# REACT_APP_SHOW_PRIVACY_POLICY=true diff --git a/.env.production b/.env.production index 1a635e908..c85348bc7 100644 --- a/.env.production +++ b/.env.production @@ -21,3 +21,4 @@ REACT_APP_SHOW_BUILD_BANNERS=false # REACT_APP_FIXED_NETWORK=testnet REACT_APP_FIXED_LAYER=pontusx REACT_APP_SHOW_FIAT_VALUES=false +# REACT_APP_SHOW_PRIVACY_POLICY=true diff --git a/src/app/components/PageLayout/Footer.tsx b/src/app/components/PageLayout/Footer.tsx index 5c5d3db3d..b89adacf5 100644 --- a/src/app/components/PageLayout/Footer.tsx +++ b/src/app/components/PageLayout/Footer.tsx @@ -4,12 +4,14 @@ import Box from '@mui/material/Box' import Typography from '@mui/material/Typography' import { useScreenSize } from '../../hooks/useScreensize' import { styled } from '@mui/material/styles' +import { Link as RouterLink } from 'react-router-dom' import Link from '@mui/material/Link' import { useTheme } from '@mui/material/styles' import { useConstant } from '../../hooks/useConstant' import { AppendMobileSearch } from '../AppendMobileSearch' import { SearchScope } from '../../../types/searchScope' import { api, github } from '../../utils/externalLinks' +import { showPrivacyPolicy } from '../../../config' const FooterBox = styled(Box)(({ theme }) => ({ display: 'flex', @@ -128,6 +130,13 @@ export const Footer: FC = ({ scope, mobileSearchAction }) => { + {showPrivacyPolicy && ( + + + {t('privacyPolicy.title')} + + + )} {isTablet ? t('footer.mobileTitle') : t('footer.title')} | {currentYear} diff --git a/src/app/pages/PrivacyPage/index.tsx b/src/app/pages/PrivacyPage/index.tsx new file mode 100644 index 000000000..e9c612fc6 --- /dev/null +++ b/src/app/pages/PrivacyPage/index.tsx @@ -0,0 +1,17 @@ +import React, { FC } from 'react' +import { useTranslation } from 'react-i18next' + +import { PageLayout } from '../../components/PageLayout' +import { SubPageCard } from '../../components/SubPageCard' + +export const PrivacyPage: FC = () => { + const { t } = useTranslation() + + return ( + + + {t('common.missing')} + + + ) +} diff --git a/src/config.ts b/src/config.ts index 89d827b21..ec54605cb 100644 --- a/src/config.ts +++ b/src/config.ts @@ -201,3 +201,5 @@ export const getFiatCurrencyForScope = (scope: SearchScope | undefined) => (scope ? paraTimesConfig[scope.layer]?.[scope.network]?.fiatCurrency : undefined) ?? 'usd' export const showFiatValues = process.env.REACT_APP_SHOW_FIAT_VALUES === 'true' + +export const showPrivacyPolicy = process.env.REACT_APP_SHOW_PRIVACY_POLICY === 'true' diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index a4bf89c23..4f664d28c 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -530,6 +530,9 @@ "noData": "No data available", "nodes": "Nodes:" }, + "privacyPolicy": { + "title": "Privacy Policy" + }, "search": { "placeholder": "Address, Block, Contract, Transaction hash, Token name, etc.", "error": { diff --git a/src/routes.tsx b/src/routes.tsx index 8021b6bb4..de2fc197c 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -47,6 +47,8 @@ import { ConsensusAccountsPage } from './app/pages/ConsensusAccountsPage' import { ConsensusTransactionsPage } from './app/pages/ConsensusTransactionsPage' import { ConsensusAccountDetailsPage } from './app/pages/ConsensusAccountDetailsPage' import { FC, useEffect } from 'react' +import { PrivacyPage } from './app/pages/PrivacyPage' +import { showPrivacyPolicy } from './config' const NetworkSpecificPart = () => ( @@ -264,6 +266,14 @@ export const routes: RouteObject[] = [ }, ], }, + ...(showPrivacyPolicy + ? [ + { + path: '/privacy', + element: withDefaultTheme(), + }, + ] + : []), ], }, ] diff --git a/src/types/global.d.ts b/src/types/global.d.ts index cac3fc202..697768d7c 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -26,6 +26,7 @@ declare global { REACT_APP_FIXED_NETWORK?: string REACT_APP_FIXED_LAYER?: string REACT_APP_SHOW_FIAT_VALUES?: string + REACT_APP_SHOW_PRIVACY_POLICY?: string } } } From d184612b4ce61fc8c24d93b7ddebf309e71e5eb1 Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Wed, 28 Feb 2024 12:55:32 +0100 Subject: [PATCH 19/20] Add PontusX Privacy Policy --- .env | 2 +- .env.production | 2 +- package.json | 2 + src/app/pages/PrivacyPage/index.tsx | 4 +- src/docs/pontusx_privacy_2024.mdx | 138 ++++++ yarn.lock | 642 ++++++++++++++++++++++++++-- 6 files changed, 751 insertions(+), 39 deletions(-) create mode 100644 src/docs/pontusx_privacy_2024.mdx diff --git a/.env b/.env index 25501db65..955c28894 100644 --- a/.env +++ b/.env @@ -26,4 +26,4 @@ REACT_APP_SHOW_BUILD_BANNERS=false # REACT_APP_FIXED_NETWORK=testnet REACT_APP_FIXED_LAYER=pontusx REACT_APP_SHOW_FIAT_VALUES=false -# REACT_APP_SHOW_PRIVACY_POLICY=true +REACT_APP_SHOW_PRIVACY_POLICY=true diff --git a/.env.production b/.env.production index c85348bc7..596fcd2d9 100644 --- a/.env.production +++ b/.env.production @@ -21,4 +21,4 @@ REACT_APP_SHOW_BUILD_BANNERS=false # REACT_APP_FIXED_NETWORK=testnet REACT_APP_FIXED_LAYER=pontusx REACT_APP_SHOW_FIAT_VALUES=false -# REACT_APP_SHOW_PRIVACY_POLICY=true +REACT_APP_SHOW_PRIVACY_POLICY=true diff --git a/package.json b/package.json index 9a848f939..7290c0aba 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,9 @@ }, "devDependencies": { "@emotion/jest": "11.11.0", + "@mdx-js/react": "^1.6.22", "@parcel/packager-raw-url": "2.11.0", + "@parcel/transformer-mdx": "2.11.0", "@parcel/transformer-webmanifest": "2.11.0", "@plasmohq/parcel-transformer-inject-env": "^0.2.11", "@storybook/addon-actions": "7.6.17", diff --git a/src/app/pages/PrivacyPage/index.tsx b/src/app/pages/PrivacyPage/index.tsx index e9c612fc6..702e060c8 100644 --- a/src/app/pages/PrivacyPage/index.tsx +++ b/src/app/pages/PrivacyPage/index.tsx @@ -4,13 +4,15 @@ import { useTranslation } from 'react-i18next' import { PageLayout } from '../../components/PageLayout' import { SubPageCard } from '../../components/SubPageCard' +import Policy from '../../../docs/pontusx_privacy_2024.mdx' + export const PrivacyPage: FC = () => { const { t } = useTranslation() return ( - {t('common.missing')} + ) diff --git a/src/docs/pontusx_privacy_2024.mdx b/src/docs/pontusx_privacy_2024.mdx new file mode 100644 index 000000000..c8452b1b2 --- /dev/null +++ b/src/docs/pontusx_privacy_2024.mdx @@ -0,0 +1,138 @@ +This privacy policy informs you about how deltaDAO AG (in the following deltaDAO, we, us, our) processes your personal data when you visit our Pontus-X Blockchain Explorer (in the following explorer) and when you contact us. Moreover, this privacy policy informs you about your rights. + +_Last updated on February 23, 2024._ + +# 1. Contact details of the controller and Data Protection Officer + +The controller pursuant to the EU General Data Protection Regulation ("GDPR") for the processing of your personal data is: + +deltaDAO AG +Katharinenstraße 30a +20457 Hamburg +Germany +E-mail: contact@delta-dao.com + +If you have any questions about the protection of your personal data at deltaDAO, please contact our Data Protection Officer: + +Data Protection Officer +deltaDAO AG +Katharinenstraße 30a +20457 Hamburg +Germany +E-mail: privacy@delta-dao.com + +# 2. What's personal data? + +Personal data is any information that can be (directly or indirectly) related to you. deltaDAO processes a minimal amount of personal data, as we believe your personal data belongs to you. We process the following personal data. + +- **Logfile data and IP addresses:** Logfile data including IP addresses are processed when visiting our explorer. +- **E-mail:** If you contact deltaDAO via e-mail, we process your e-mail address and any personal data you decide to provide in your message (such as your name). + +For detailed information about the processing operations, lawfulness, purposes, and how your personal data serves to reach these purposes, please take a look at the chapter "Processing operations according to Article 13 GDPR". + +# 3. Recipients and cross-border data transfer + +**Visiting our explorer** +When visiting our explorer, your IP address and logfile data are processed by Vercel Inc., 340 S Lemon Ave #4133, Walnut, CA 91789, USA. Vercel is a service provider that hosts our explorer. Our explorer is served by Vercel using a Content Delivery Network, a geographically distributed network, with servers within and outside of the European Economic Area (EEA). This means, if you are located within the EEA, your personal data will most likely (but not guaranteed) be processed on a Vercel server within the EEA. + +There is no adequacy decision for the USA from the European Commission. Our cooperation with Vercel is based on a Data Processing Agreement (DPA) including Standard Contractual Clauses (SCC). You have the right to receive a copy of these SCC. To exercise your right, please contact us at . + +- Here you can find Vercel's current [**DPA including SCC** ↗](https://vercel.com/legal/dpa). +- Here you can find Vercel's [**privacy policy** ↗](https://vercel.com/legal/privacy-policy). + +**Contact via e-mail** +When you contact us via e-mail, our (mail) service provider Microsoft Corporation (located at 1 Microsoft Way, Redmond, Washington 98052-8300, USA) supports us in processing your personal data so we can communicate with you. + +There is no adequacy decision for the USA from the European Commission. However, Microsoft is EU-US DPF (EU‐US Data Privacy Framework) certified. The EU‐US DPF is an adequacy decision of the European Commission, limited to certified entities. Moreover, we have restricted storage on the EEA and signed SCC with our provider. You have the right to receive a copy of these SCC. To exercise your right, please contact us at . + +- Here you can find Microsoft's current [**DPA including SCC** ↗](https://www.microsoft.com/licensing/docs/view/Microsoft-Products-and-Services-Data-Protection-Addendum-DPA). +- Here you can find Microsoft's [**privacy policy** ↗](https://privacy.microsoft.com/de-de/privacystatement). +- Here you can find Microsoft's [**Data Privacy Framework List entry** ↗](https://www.dataprivacyframework.gov/list). + +# 4. Processing operations according to Article 13 GDPR + +## **4.1 Providing the Pontus-X Blockchain Explorer** + +The Pontus-X Blockchain Explorer for the Pontus-X ParaTime enables users to inspect and analyze the transactions made on the Pontus-X ParaTime, including the tracking of transaction histories, wallet interactions, and smart contract operations. Logfile data and IP addresses are collected, used, and stored for providing our explorer and its functionalities and to maintain its security. Our explorer is hosted externally by our service provider Vercel (see also chapter 3). + +**Purposes:** Collecting and using your IP address is necessary for providing our explorer because it is a technical requirement for ensuring communication between your device and our explorer. Logfiles including your IP address are created for security, fraud-prevention, abuse-prevention, and troubleshooting purposes. + +**Legal basis:** The legal basis for this processing is our legitimate interest, pursuant to Art. 6(1)(f) GDPR. + +**Legitimate interests:** Our legitimate interest is to provide our explorer and its functionalities to you and to enable security, a technically error-free presentation, and the optimization of the explorer. + +**Retention period:** Vercel retains your personal data for as long as needed to provide their services. Additionally, Vercel does not delete the data when it is needed for the establishment, exercise, or defense of legal claims. In this case, the information is retained as long as needed for exercising respective potential legal claims. + +## **4.2 Contact via e-mail** + +If you contact us via e-mail, deltaDAO collects, uses and stores your e-mail address, and any other information you provide us in your message, such as your name. + +**Purposes:** +We collect, use and store this personal data to respond to your inquiries. + +**Legal basis:** +The legal basis for this processing is our legitimate interest, according to Art. 6(1)(f) GDPR. + +**Legitimate interests:** +Our legitimate interest is to answer your inquiries. + +**Retention period:** +deltaDAO deletes your personal data as soon as we no longer require them for processing your inquiry, except deltaDAO is obliged to comply with legal retention periods or in case of legal disputes. + +# 5. Automated decision making including profiling according to Article 13(2)(f) GDPR + +Automated decision making including profiling does not take place. + +# 6. Cookies + +A cookie is a small file that stores Internet settings. Your web browser downloads it on the first visit to a website. The next time you open this website with the same device, the cookie and the information stored in it are either sent back to the website that created it (first-party cookie) or sent to another website it belongs to (third-party cookie). This enables the website to detect that you have opened it previously with this browser and, in some cases, to vary the displayed content. + +Our explorer does not use cookies. + +# 7. External links + +Our explorer contains links to external websites that are beyond the control and responsibility of deltaDAO. + +# 8. Your rights + +If you want to make use of your rights described below, do not hesitate to contact us. + +**8.1 Right of access (Art. 15 GDPR)** + +You have the right to obtain confirmation as to whether deltaDAO processes personal data about you. If we are processing personal data about you, you have the right to access these personal data and to gain the information defined in Art. 15 GDPR. + +**8.2 Right to rectification (Art. 16 GDPR)** + +You have the right to obtain without undue delay the rectification of inaccurate personal data about you. Additionally, you have the right that incomplete personal data about you are completed. + +**8.3 Right to erasure (Art. 17 GDPR)** + +You have the right to obtain without undue delay the rectification of inaccurate personal data about you. Additionally, you have the right that incomplete personal data about you are completed. + +**8.4 Right to restriction (Art. 18 GDPR)** + +Moreover, you have the right to obtain the restriction of processing your personal data where the defined legal grounds in Art. 18 GDPR apply. + +**8.5 Right to data portability (Art. 20 GDPR)** + +You have the right to receive your personal data in a structured, commonly used, and machine-readable format. Additionally, you have the right to transmit those data to another controller without hindrance, where the defined legal grounds in Art. 20 GDPR apply. You can make use of your right to data portability by contacting us. + +**8.6 Right to object (Art. 21 GDPR)** + +On grounds relating to your particular situation, you have the right to object to the processing of your personal data where we based the processing on legitimate interests (Art. 6(1)(f) GDPR). If you object, deltaDAO will no longer process your personal data unless we can demonstrate compelling legitimate grounds for the processing, overriding your rights, freedoms, and interests, or if the processing is required to establish, exercise, or defend legal claims. + +**8.7 Right to lodge a complaint (Art. 77 GDPR)** + +You have the right to lodge a complaint with a supervisory authority if you consider the processing of your personal data by deltaDAO to infringe the GDPR. You can lodge a complaint in particular + +- in the Member State of your habitual residence, +- in the Member State of your place of work, and +- in the place of the alleged infringement. + +# 9. Questions + +For any requests regarding our privacy policy, please send us an e-mail to [privacy@delta-dao.com](mailto:privacy@delta-dao.com). + +# 10. Changes to the Privacy Policy + +We adjust this policy from time to time, by publishing a new version on our explorer. You can find the date of the current version at the beginning of this policy. The latest version of this policy applies to the processing of your personal data. diff --git a/yarn.lock b/yarn.lock index 9d9e4681f..681a4c6e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -66,6 +66,28 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== +"@babel/core@7.12.9": + version "7.12.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" + integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.7" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.9" + "@babel/types" "^7.12.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" @@ -117,6 +139,16 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" +"@babel/generator@^7.12.5", "@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== + dependencies: + "@babel/types" "^7.23.6" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/generator@^7.22.10", "@babel/generator@^7.7.2": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" @@ -147,16 +179,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== - dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -331,6 +353,17 @@ dependencies: "@babel/types" "^7.22.15" +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" @@ -342,17 +375,6 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.5" -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -360,6 +382,11 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" @@ -470,6 +497,15 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.10" +"@babel/helpers@^7.12.5": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" + "@babel/helpers@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" @@ -520,6 +556,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.11.tgz#becf8ee33aad2a35ed5607f521fe6e72a615f905" integrity sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g== +"@babel/parser@^7.12.7", "@babel/parser@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== + "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" @@ -610,6 +651,15 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-proposal-optional-chaining@^7.16.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" @@ -737,6 +787,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" @@ -772,7 +829,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-syntax-object-rest-spread@^7.8.3": +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== @@ -1385,6 +1442,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-parameters@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" @@ -1392,13 +1456,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-parameters@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" - integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-transform-private-methods@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" @@ -1977,6 +2034,15 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/template@^7.12.7", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -1995,6 +2061,22 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/traverse@^7.12.9", "@babel/traverse@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + debug "^4.3.1" + globals "^11.1.0" + "@babel/traverse@^7.18.9", "@babel/traverse@^7.22.11", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" @@ -2020,6 +2102,15 @@ "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" +"@babel/types@^7.12.7", "@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@babel/types@^7.18.9", "@babel/types@^7.22.19", "@babel/types@^7.23.3", "@babel/types@^7.23.4": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.4.tgz#7206a1810fc512a7f7f7d4dace4cb4c1c9dbfb8e" @@ -2811,6 +2902,36 @@ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz#8233e8762440b0f4632c47a09b1b6f23de8b934c" integrity sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ== +"@mdx-js/mdx@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" + integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== + dependencies: + "@babel/core" "7.12.9" + "@babel/plugin-syntax-jsx" "7.12.1" + "@babel/plugin-syntax-object-rest-spread" "7.8.3" + "@mdx-js/util" "1.6.22" + babel-plugin-apply-mdx-type-prop "1.6.22" + babel-plugin-extract-import-names "1.6.22" + camelcase-css "2.0.1" + detab "2.0.4" + hast-util-raw "6.0.1" + lodash.uniq "4.5.0" + mdast-util-to-hast "10.0.1" + remark-footnotes "2.0.0" + remark-mdx "1.6.22" + remark-parse "8.0.3" + remark-squeeze-paragraphs "4.0.0" + style-to-object "0.3.0" + unified "9.2.0" + unist-builder "2.0.3" + unist-util-visit "2.0.3" + +"@mdx-js/react@^1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" + integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== + "@mdx-js/react@^2.1.5": version "2.3.0" resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-2.3.0.tgz#4208bd6d70f0d0831def28ef28c26149b03180b3" @@ -2819,6 +2940,11 @@ "@types/mdx" "^2.0.0" "@types/react" ">=16" +"@mdx-js/util@1.6.22": + version "1.6.22" + resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" + integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== + "@metamask/jazzicon@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@metamask/jazzicon/-/jazzicon-2.0.0.tgz#5615528e91c0fc5c9d79202d1f0954a7922525a0" @@ -3731,6 +3857,14 @@ "@parcel/plugin" "2.11.0" json5 "^2.2.0" +"@parcel/transformer-mdx@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@parcel/transformer-mdx/-/transformer-mdx-2.11.0.tgz#f8288a95bfff86c7483e02f90d63e9d8c67a7b94" + integrity sha512-eajmj52AxgtUFvPu4Iak8+tmABxlzyCpAkJtKBoOWIJn03SsggK2rxVYOrE4fYe0gWfcTBSz2u5Bc15S/Ur3Rg== + dependencies: + "@mdx-js/mdx" "^1.6.22" + "@parcel/plugin" "2.11.0" + "@parcel/transformer-postcss@2.11.0": version "2.11.0" resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.11.0.tgz#df5e776a7383400a34c54a64a0bd8f998b656316" @@ -5547,6 +5681,13 @@ dependencies: "@types/node" "*" +"@types/hast@^2.0.0": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== + dependencies: + "@types/unist" "^2" + "@types/html-minifier-terser@^6.0.0": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" @@ -5613,6 +5754,13 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.197.tgz#e95c5ddcc814ec3e84c891910a01e0c8a378c54b" integrity sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g== +"@types/mdast@^3.0.0": + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== + dependencies: + "@types/unist" "^2" + "@types/mdx@^2.0.0": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.7.tgz#c7482e995673e01b83f8e96df83b3843ea76401f" @@ -5678,6 +5826,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + "@types/pretty-hrtime@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" @@ -5791,6 +5944,11 @@ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== +"@types/unist@^2", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== + "@types/unist@^2.0.0": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" @@ -6537,6 +6695,21 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw== +babel-plugin-apply-mdx-type-prop@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" + integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + "@mdx-js/util" "1.6.22" + +babel-plugin-extract-import-names@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" + integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== + dependencies: + "@babel/helper-plugin-utils" "7.10.4" + babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" @@ -6668,6 +6841,11 @@ babel-preset-react-app@^10.0.1: babel-plugin-macros "^3.1.0" babel-plugin-transform-react-remove-prop-types "^0.4.24" +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -6905,6 +7083,11 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" +camelcase-css@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -6935,6 +7118,11 @@ cborg@^2.0.3: resolved "https://registry.yarnpkg.com/cborg/-/cborg-2.0.5.tgz#b5393c8b1843d5c1a61f2b79b4c9f752052a4d44" integrity sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w== +ccount@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== + chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -6970,6 +7158,21 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -7103,6 +7306,11 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== +collapse-white-space@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" + integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== + collect-v8-coverage@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" @@ -7160,6 +7368,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -7685,6 +7898,13 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detab@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" + integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== + dependencies: + repeat-string "^1.5.4" + detect-indent@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" @@ -8889,7 +9109,7 @@ functions-have-names@^1.2.2, functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== @@ -9159,6 +9379,74 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hast-to-hyperscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== + dependencies: + "@types/unist" "^2.0.3" + comma-separated-tokens "^1.0.0" + property-information "^5.3.0" + space-separated-tokens "^1.0.0" + style-to-object "^0.3.0" + unist-util-is "^4.0.0" + web-namespaces "^1.0.0" + +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-raw@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" + integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== + dependencies: + "@types/hast" "^2.0.0" + hast-util-from-parse5 "^6.0.0" + hast-util-to-parse5 "^6.0.0" + html-void-elements "^1.0.0" + parse5 "^6.0.0" + unist-util-position "^3.0.0" + vfile "^4.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hast-util-to-parse5@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" + integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== + dependencies: + hast-to-hyperscript "^9.0.0" + property-information "^5.0.0" + web-namespaces "^1.0.0" + xtend "^4.0.0" + zwitch "^1.0.0" + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -9232,6 +9520,11 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== +html-void-elements@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" + integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== + html-webpack-plugin@^5.5.0: version "5.5.3" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz#72270f4a78e222b5825b296e5e3e1328ad525a3e" @@ -9388,7 +9681,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -9398,6 +9691,11 @@ ini@~4.1.0: resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== +inline-style-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + inquirer@^8.2.0: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -9455,6 +9753,19 @@ is-absolute-url@^3.0.0: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== +is-alphabetical@1.0.4, is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -9506,6 +9817,11 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-buffer@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -9525,6 +9841,11 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-deflate@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" @@ -9576,6 +9897,11 @@ is-gzip@^1.0.0: resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -9631,6 +9957,11 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" @@ -9724,6 +10055,16 @@ is-what@^4.1.8: resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.15.tgz#de43a81090417a425942d67b1ae86e7fae2eee0e" integrity sha512-uKua1wfy3Yt+YqsD6mTUEa2zSi3G1oPlqTflgaPJ7z63vUGN5pxFpnQfeSLMFnJDEsdvOtkp1rUWkYjB4YfhgA== +is-whitespace-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" + integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== + +is-word-character@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" + integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -10664,6 +11005,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.uniq@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -10766,6 +11112,11 @@ map-or-similar@^1.5.0: resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== +markdown-escapes@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" + integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== + markdown-it@14.0.0: version "14.0.0" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.0.0.tgz#b4b2ddeb0f925e88d981f84c183b59bac9e3741b" @@ -10811,6 +11162,13 @@ markdownlint@~0.33.0: markdown-it "14.0.0" markdownlint-micromark "0.1.8" +mdast-squeeze-paragraphs@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" + integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== + dependencies: + unist-util-remove "^2.0.0" + mdast-util-definitions@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" @@ -10818,6 +11176,20 @@ mdast-util-definitions@^4.0.0: dependencies: unist-util-visit "^2.0.0" +mdast-util-to-hast@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" + integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + mdast-util-definitions "^4.0.0" + mdurl "^1.0.0" + unist-builder "^2.0.0" + unist-util-generated "^1.0.0" + unist-util-position "^3.0.0" + unist-util-visit "^2.0.0" + mdast-util-to-string@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" @@ -10828,6 +11200,11 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdurl@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + mdurl@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" @@ -11479,6 +11856,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -11489,6 +11878,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^7.0.0, parse5@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" @@ -11826,6 +12220,13 @@ prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +property-information@^5.0.0, property-information@^5.3.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + protobufjs@~7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.5.tgz#45d5c57387a6d29a17aab6846dcc283f9b8e7f2d" @@ -12328,6 +12729,47 @@ remark-external-links@^8.0.0: space-separated-tokens "^1.0.0" unist-util-visit "^2.0.0" +remark-footnotes@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" + integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== + +remark-mdx@1.6.22: + version "1.6.22" + resolved "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" + integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== + dependencies: + "@babel/core" "7.12.9" + "@babel/helper-plugin-utils" "7.10.4" + "@babel/plugin-proposal-object-rest-spread" "7.12.1" + "@babel/plugin-syntax-jsx" "7.12.1" + "@mdx-js/util" "1.6.22" + is-alphabetical "1.0.4" + remark-parse "8.0.3" + unified "9.2.0" + +remark-parse@8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" + integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + remark-slug@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" @@ -12337,6 +12779,13 @@ remark-slug@^6.0.0: mdast-util-to-string "^1.0.0" unist-util-visit "^2.0.0" +remark-squeeze-paragraphs@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" + integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== + dependencies: + mdast-squeeze-paragraphs "^4.0.0" + remove-accents@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" @@ -12353,6 +12802,11 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" +repeat-string@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -12399,7 +12853,7 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.22.1: +resolve@^1.22.1, resolve@^1.3.2: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -12547,7 +13001,7 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -"semver@2 || 3 || 4 || 5", semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -12686,7 +13140,7 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== @@ -12764,6 +13218,11 @@ stackframe@^1.3.4: resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +state-toggle@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" + integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -12944,6 +13403,13 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== +style-to-object@0.3.0, style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + stylis@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" @@ -13210,6 +13676,21 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +trim-trailing-lines@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== + +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + ts-api-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.2.tgz#7c094f753b6705ee4faee25c3c684ade52d66d99" @@ -13400,6 +13881,14 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +unherit@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" + integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== + dependencies: + inherits "^2.0.0" + xtend "^4.0.0" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -13423,6 +13912,18 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== +unified@9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" + integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -13430,11 +13931,47 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-builder@2.0.3, unist-builder@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-generated@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== + unist-util-is@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== +unist-util-position@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" + integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== + +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + +unist-util-remove@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== + dependencies: + unist-util-is "^4.0.0" + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + unist-util-visit-parents@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" @@ -13443,7 +13980,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@^2.0.0: +unist-util-visit@2.0.3, unist-util-visit@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -13606,6 +14143,29 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + victory-vendor@^36.6.8: version "36.6.11" resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.6.11.tgz#acae770717c2dae541a54929c304ecab5ab6ac2a" @@ -13674,6 +14234,11 @@ web-encoding@^1.1.5: optionalDependencies: "@zxing/text-encoding" "0.9.0" +web-namespaces@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" + integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -13906,7 +14471,7 @@ xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -13971,3 +14536,8 @@ yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +zwitch@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" + integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== From 857d1188358ab30c64046d23a8efbdee00eefa9e Mon Sep 17 00:00:00 2001 From: Kristof Csillag Date: Thu, 29 Feb 2024 02:11:19 +0100 Subject: [PATCH 20/20] Update Pontus-X privacy policy (title levels only) --- src/docs/pontusx_privacy_2024.mdx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/docs/pontusx_privacy_2024.mdx b/src/docs/pontusx_privacy_2024.mdx index c8452b1b2..129b50ba5 100644 --- a/src/docs/pontusx_privacy_2024.mdx +++ b/src/docs/pontusx_privacy_2024.mdx @@ -2,7 +2,7 @@ This privacy policy informs you about how deltaDAO AG (in the following deltaDAO _Last updated on February 23, 2024._ -# 1. Contact details of the controller and Data Protection Officer +### 1. Contact details of the controller and Data Protection Officer The controller pursuant to the EU General Data Protection Regulation ("GDPR") for the processing of your personal data is: @@ -21,7 +21,7 @@ Katharinenstraße 30a Germany E-mail: privacy@delta-dao.com -# 2. What's personal data? +### 2. What's personal data? Personal data is any information that can be (directly or indirectly) related to you. deltaDAO processes a minimal amount of personal data, as we believe your personal data belongs to you. We process the following personal data. @@ -30,7 +30,7 @@ Personal data is any information that can be (directly or indirectly) related to For detailed information about the processing operations, lawfulness, purposes, and how your personal data serves to reach these purposes, please take a look at the chapter "Processing operations according to Article 13 GDPR". -# 3. Recipients and cross-border data transfer +### 3. Recipients and cross-border data transfer **Visiting our explorer** When visiting our explorer, your IP address and logfile data are processed by Vercel Inc., 340 S Lemon Ave #4133, Walnut, CA 91789, USA. Vercel is a service provider that hosts our explorer. Our explorer is served by Vercel using a Content Delivery Network, a geographically distributed network, with servers within and outside of the European Economic Area (EEA). This means, if you are located within the EEA, your personal data will most likely (but not guaranteed) be processed on a Vercel server within the EEA. @@ -49,9 +49,9 @@ There is no adequacy decision for the USA from the European Commission. However, - Here you can find Microsoft's [**privacy policy** ↗](https://privacy.microsoft.com/de-de/privacystatement). - Here you can find Microsoft's [**Data Privacy Framework List entry** ↗](https://www.dataprivacyframework.gov/list). -# 4. Processing operations according to Article 13 GDPR +### 4. Processing operations according to Article 13 GDPR -## **4.1 Providing the Pontus-X Blockchain Explorer** +#### **4.1 Providing the Pontus-X Blockchain Explorer** The Pontus-X Blockchain Explorer for the Pontus-X ParaTime enables users to inspect and analyze the transactions made on the Pontus-X ParaTime, including the tracking of transaction histories, wallet interactions, and smart contract operations. Logfile data and IP addresses are collected, used, and stored for providing our explorer and its functionalities and to maintain its security. Our explorer is hosted externally by our service provider Vercel (see also chapter 3). @@ -63,7 +63,7 @@ The Pontus-X Blockchain Explorer for the Pontus-X ParaTime enables users to insp **Retention period:** Vercel retains your personal data for as long as needed to provide their services. Additionally, Vercel does not delete the data when it is needed for the establishment, exercise, or defense of legal claims. In this case, the information is retained as long as needed for exercising respective potential legal claims. -## **4.2 Contact via e-mail** +#### **4.2 Contact via e-mail** If you contact us via e-mail, deltaDAO collects, uses and stores your e-mail address, and any other information you provide us in your message, such as your name. @@ -79,21 +79,21 @@ Our legitimate interest is to answer your inquiries. **Retention period:** deltaDAO deletes your personal data as soon as we no longer require them for processing your inquiry, except deltaDAO is obliged to comply with legal retention periods or in case of legal disputes. -# 5. Automated decision making including profiling according to Article 13(2)(f) GDPR +### 5. Automated decision making including profiling according to Article 13(2)(f) GDPR Automated decision making including profiling does not take place. -# 6. Cookies +### 6. Cookies A cookie is a small file that stores Internet settings. Your web browser downloads it on the first visit to a website. The next time you open this website with the same device, the cookie and the information stored in it are either sent back to the website that created it (first-party cookie) or sent to another website it belongs to (third-party cookie). This enables the website to detect that you have opened it previously with this browser and, in some cases, to vary the displayed content. Our explorer does not use cookies. -# 7. External links +### 7. External links Our explorer contains links to external websites that are beyond the control and responsibility of deltaDAO. -# 8. Your rights +### 8. Your rights If you want to make use of your rights described below, do not hesitate to contact us. @@ -129,10 +129,10 @@ You have the right to lodge a complaint with a supervisory authority if you cons - in the Member State of your place of work, and - in the place of the alleged infringement. -# 9. Questions +### 9. Questions For any requests regarding our privacy policy, please send us an e-mail to [privacy@delta-dao.com](mailto:privacy@delta-dao.com). -# 10. Changes to the Privacy Policy +### 10. Changes to the Privacy Policy We adjust this policy from time to time, by publishing a new version on our explorer. You can find the date of the current version at the beginning of this policy. The latest version of this policy applies to the processing of your personal data.