diff --git a/public/_locales/de/messages.json b/public/_locales/de/messages.json index 71f8e47fd4..6e64b0cbeb 100644 --- a/public/_locales/de/messages.json +++ b/public/_locales/de/messages.json @@ -499,6 +499,10 @@ "message": "Tezos Mainnet", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold Mainnet", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple Wallet | Optionen" }, diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 9fdcd5892e..3b83c89fca 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -624,10 +624,20 @@ "tryAgain": { "message": "Try again" }, + "errorGettingBakerAddressMessageOnline": { + "message": "Failed to get baker's address. Please, reload the page and try again." + }, + "errorGettingBakerAddressMessage": { + "message": "Failed to get baker's address. Please, check your internet connection and try again." + }, "tezosMainnet": { "message": "Tezos Mainnet", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold Mainnet", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple Wallet | Options" }, @@ -1975,7 +1985,7 @@ "message": "Confirm the action" }, "closePartnersPromotion": { - "message": "Are you sure you want to turn off all ads?" + "message": "Are you sure you want to disable all ads?" }, "domainDoesntResolveToAddress": { "message": "Domain \"$value$\" doesn't resolve to an address", @@ -2421,7 +2431,7 @@ "message": "Are you sure you want to delete this contact?" }, "closePartnersPromoConfirm": { - "message": "Pay attention: you can receive cashback in USDt tokens for enabling advertisement in our wallet. If you turned off ADS, you can always activate it in the settings." + "message": "Pay attention: you can receive rewards in TKEY tokens for viewing ads in our wallet. If you disabled Ads, you can always activate it in the settings." }, "enablePartnersPromotionConfirm": { "message": "Support the development team and earn tokens by viewing ads inside the wallet." @@ -2614,14 +2624,17 @@ "partnersPromoSettings": { "message": "Advertising" }, - "cashBack": { - "message": "cash back" - }, - "partnersPromoDescriptionP1": { - "message": "Here you can configure displaying of ads in Temple wallet. Remember, you get" + "rewards": { + "message": "rewards", + "description": "Part of partnersPromoDescription phrase" }, - "partnersPromoDescriptionP2": { - "message": "at Temple Keys for viewing ads" + "partnersPromoDescription": { + "message": "Here you can configure displaying of ads in Temple wallet. Remember, you get $rewards$ at TKEY tokens for viewing ads.", + "placeholders": { + "rewards": { + "content": "$1" + } + } }, "totalEquityValue": { "message": "Total Equity Value" diff --git a/public/_locales/en_GB/messages.json b/public/_locales/en_GB/messages.json index 366bd3c6c3..07894db752 100644 --- a/public/_locales/en_GB/messages.json +++ b/public/_locales/en_GB/messages.json @@ -503,6 +503,10 @@ "message": "Tezos Mainnet", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold Mainnet", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple Wallet | Options" }, diff --git a/public/_locales/fr/messages.json b/public/_locales/fr/messages.json index c769354adc..acbd10eced 100644 --- a/public/_locales/fr/messages.json +++ b/public/_locales/fr/messages.json @@ -481,6 +481,10 @@ "message": "Mainnet Tezos", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Mainnet Marigold", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Portefeuille Temple | Options" }, diff --git a/public/_locales/pt/messages.json b/public/_locales/pt/messages.json index a59be5a410..1a7846f0da 100644 --- a/public/_locales/pt/messages.json +++ b/public/_locales/pt/messages.json @@ -499,6 +499,10 @@ "message": "Tezos Mainnet", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold Mainnet", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Carteira Temple | Opções" }, diff --git a/public/_locales/tr/messages.json b/public/_locales/tr/messages.json index 406cc5467a..a13f53d88e 100644 --- a/public/_locales/tr/messages.json +++ b/public/_locales/tr/messages.json @@ -499,6 +499,10 @@ "message": "Tezos Mainnet", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold Mainnet", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple Wallet | Seçenekler" }, diff --git a/public/_locales/uk/messages.json b/public/_locales/uk/messages.json index fc9e3e4423..c875558905 100644 --- a/public/_locales/uk/messages.json +++ b/public/_locales/uk/messages.json @@ -498,6 +498,10 @@ "message": "Tezos Mainnet", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold Mainnet", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple Wallet | Налаштування" }, diff --git a/public/_locales/zh_CN/messages.json b/public/_locales/zh_CN/messages.json index 56362e64e0..2ba7c8d2b0 100644 --- a/public/_locales/zh_CN/messages.json +++ b/public/_locales/zh_CN/messages.json @@ -481,6 +481,10 @@ "message": "Tezos主网", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold主网", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple钱包 | 选项" }, diff --git a/public/_locales/zh_TW/messages.json b/public/_locales/zh_TW/messages.json index 4b70386003..733d6115ce 100644 --- a/public/_locales/zh_TW/messages.json +++ b/public/_locales/zh_TW/messages.json @@ -481,6 +481,10 @@ "message": "Tezos 主網路", "description": "Mainnet = main network" }, + "marigoldMainnet": { + "message": "Marigold 主網路", + "description": "Mainnet = main network" + }, "templeWalletOptions": { "message": "Temple 錢包 | 選項" }, diff --git a/src/app/ErrorBoundary.tsx b/src/app/ErrorBoundary.tsx index 8093e9efdd..88493c056a 100644 --- a/src/app/ErrorBoundary.tsx +++ b/src/app/ErrorBoundary.tsx @@ -3,13 +3,20 @@ import React, { Component, ErrorInfo } from 'react'; import classNames from 'clsx'; import { ReactComponent as DangerIcon } from 'app/icons/danger.svg'; -import { T } from 'lib/i18n'; +import { t, T } from 'lib/i18n'; +import { getOnlineStatus } from 'lib/temple/front'; interface ErrorBoundaryProps extends React.PropsWithChildren { className?: string; whileMessage?: string; } +export class BoundaryError extends Error { + constructor(public readonly message: string, public readonly beforeTryAgain: EmptyFn) { + super(message); + } +} + type ErrorBoundaryState = { error: Error | null; }; @@ -33,37 +40,36 @@ export default class ErrorBoundary extends Component { }); } - tryAgain() { + async tryAgain() { + const { error } = this.state; + if (error instanceof BoundaryError) { + error.beforeTryAgain(); + } this.setState({ error: null }); } + getDefaultErrorMessage() { + const { whileMessage } = this.props; + const online = getOnlineStatus(); + const firstPart = whileMessage ? t('smthWentWrongWhile', [whileMessage]) : t('smthWentWrong'); + + return online ? firstPart : [firstPart, t('mayHappenBecauseYouAreOffline')].join('. '); + } + render() { - if (this.state.error) { - const online = getOnlineStatus(); + const { className, children } = this.props; + const { error } = this.state; + if (error) { return ( -
+
{message =>

{message}

}

- {this.props.whileMessage ? ( - - ) : ( - - )} - {!online && ( - - {message => ( - <> - {'. '} - {message} - - )} - - )} + {error instanceof BoundaryError ? error.message : this.getDefaultErrorMessage()}

@@ -92,10 +98,6 @@ export default class ErrorBoundary extends Component { ); } - return this.props.children; + return children; } } - -function getOnlineStatus() { - return typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true; -} diff --git a/src/app/pages/Home/ContentSection.tsx b/src/app/pages/Home/ContentSection.tsx index 9717ead2d0..988699a57c 100644 --- a/src/app/pages/Home/ContentSection.tsx +++ b/src/app/pages/Home/ContentSection.tsx @@ -1,4 +1,4 @@ -import React, { FC, ReactNode, Suspense, useCallback, useMemo, useRef } from 'react'; +import React, { FC, memo, Suspense, useCallback, useMemo, useRef } from 'react'; import clsx from 'clsx'; @@ -33,7 +33,7 @@ interface TabData { whileMessageI18nKey?: TID; } -export const ContentSection: FC = ({ assetSlug, className }) => { +export const ContentSection = memo(({ assetSlug, className }) => { const { fullPage } = useAppEnv(); const tabSlug = useTabSlug(); @@ -115,25 +115,29 @@ export const ContentSection: FC = ({ assetSlug, className }) => {
- - {Component && } - +
); -}; +}); -interface SuspenseContainerProps extends PropsWithChildren { +interface ContentContainerProps { whileMessage: string; - fallback?: ReactNode; + ContentComponent: React.FC | React.ExoticComponent; } -const SuspenseContainer: FC = ({ whileMessage, fallback = , children }) => ( +const ContentContainer = memo(({ whileMessage, ContentComponent }) => ( - {children} + }> + + -); +)); -const SpinnerSection: FC = () => ( +const SpinnerSection = () => (
diff --git a/src/app/pages/Home/OtherComponents/BakingSection.tsx b/src/app/pages/Home/OtherComponents/BakingSection.tsx index 025815ebab..374b84376e 100644 --- a/src/app/pages/Home/OtherComponents/BakingSection.tsx +++ b/src/app/pages/Home/OtherComponents/BakingSection.tsx @@ -70,7 +70,7 @@ const links = [ const BakingSection = memo(() => { const acc = useAccount(); - const { data: myBakerPkh } = useDelegate(acc.publicKeyHash); + const { data: myBakerPkh } = useDelegate(acc.publicKeyHash, true, false); const canDelegate = acc.type !== TempleAccountType.WatchOnly; const chainId = useChainId(true); const { isDcpNetwork } = useGasToken(); diff --git a/src/app/templates/SettingsGeneral/Components/partners-promotion-settings.tsx b/src/app/templates/SettingsGeneral/Components/partners-promotion-settings.tsx index e96f8d1b6b..3dcc7f029d 100644 --- a/src/app/templates/SettingsGeneral/Components/partners-promotion-settings.tsx +++ b/src/app/templates/SettingsGeneral/Components/partners-promotion-settings.tsx @@ -5,11 +5,11 @@ import { useDispatch } from 'react-redux'; import { FormCheckbox } from 'app/atoms'; import { togglePartnersPromotionAction } from 'app/store/partners-promotion/actions'; import { useShouldShowPartnersPromoSelector } from 'app/store/partners-promotion/selectors'; +import { setAdsBannerVisibilityAction } from 'app/store/settings/actions'; +import { useIsEnabledAdsBannerSelector } from 'app/store/settings/selectors'; import { T, t } from 'lib/i18n'; import { useConfirm } from 'lib/ui/dialog'; -import { setAdsBannerVisibilityAction } from '../../../store/settings/actions'; -import { useIsEnabledAdsBannerSelector } from '../../../store/settings/selectors'; import { SettingsGeneralSelectors } from '../selectors'; export const PartnersPromotionSettings: FC = () => { @@ -63,15 +63,14 @@ export const PartnersPromotionSettings: FC = () => { - - - - - - - - - + + + + ]} + /> diff --git a/src/app/templates/activity/Activity.tsx b/src/app/templates/activity/Activity.tsx index 8bbe50c041..1464ca5037 100644 --- a/src/app/templates/activity/Activity.tsx +++ b/src/app/templates/activity/Activity.tsx @@ -32,7 +32,17 @@ export const ActivityComponent: React.FC = ({ assetSlug }) => { if (activities.length === 0 && !loading && reachedTheEnd) { return ( -
+
+
+ +
+

@@ -52,6 +62,11 @@ export const ActivityComponent: React.FC = ({ assetSlug }) => { return (
+ {loading && activities.length === 0 && ( +
+ +
+ )} fetchGet(chainId, `/accounts/${accountAddress}/operations`, params); +) => + fetchGet(chainId, `/accounts/${accountAddress}/operations`, { + ...params, + type: Array.isArray(params.type) ? params.type.join(',') : params.type + }); export const fetchGetOperationsByHash = ( chainId: TzktApiChainId, @@ -189,3 +194,6 @@ export const fetchAllTokensBalancesFromTzkt = async (selectedRpcUrl: string, acc return balances; }; + +export const getAccountStatsFromTzkt = async (account: string, chainId: TzktApiChainId) => + fetchGet(chainId, `/accounts/${account}`); diff --git a/src/lib/apis/tzkt/index.ts b/src/lib/apis/tzkt/index.ts index 52ec9fe1e3..8dee3bd0a8 100644 --- a/src/lib/apis/tzkt/index.ts +++ b/src/lib/apis/tzkt/index.ts @@ -9,9 +9,12 @@ export type { TzktAccountToken } from './types'; +export { TzktAccountType } from './types'; + export type { TzktApiChainId } from './api'; export { isKnownChainId, + getAccountStatsFromTzkt, getDelegatorRewards, getOneUserContracts, fetchTzktTokens, diff --git a/src/lib/apis/tzkt/types.ts b/src/lib/apis/tzkt/types.ts index d20e282dd4..6adaab43b3 100644 --- a/src/lib/apis/tzkt/types.ts +++ b/src/lib/apis/tzkt/types.ts @@ -221,3 +221,271 @@ export interface TzktTokenTransfer { }; transactionId: number; } + +export enum TzktAccountType { + User = 'user', + Delegate = 'delegate', + Contract = 'contract', + Ghost = 'ghost', + Rollup = 'rollup', + SmartRollup = 'smart_rollup', + Empty = 'empty' +} + +interface TzktAccountBase { + type: TzktAccountType; + address: string; + alias: string | nullish; +} + +interface TzktUserAccount extends TzktAccountBase { + type: TzktAccountType.User; + id: number; + publicKey: string; + revealed: boolean; + balance: number; + rollupBonds: number; + smartRollupBonds: number; + counter: number; + delegate: TzktAlias | nullish; + delegationLevel: number; + delegationTime: string | nullish; + numContracts: number; + rollupsCount: number; + smartRollupsCount: number; + activeTokensCount: number; + tokenBalancesCount: number; + tokenTransfersCount: number; + numActivations: number; + numDelegations: number; + numOriginations: number; + numTransactions: number; + numReveals: number; + numRegisterConstants: number; + numSetDepositsLimits: number; + numMigrations: number; + txRollupOriginationCount: number; + txRollupSubmitBatchCount: number; + txRollupCommitCount: number; + txRollupReturnBondCount: number; + txRollupFinalizeCommitmentCount: number; + txRollupRemoveCommitmentCount: number; + txRollupRejectionCount: number; + txRollupDispatchTicketsCount: number; + transferTicketCount: number; + increasePaidStorageCount: number; + drainDelegateCount: number; + smartRollupAddMessagesCount: number; + smartRollupCementCount: number; + smartRollupExecuteCount: number; + smartRollupOriginateCount: number; + smartRollupPublishCount: number; + smartRollupRecoverBondCount: number; + smartRollupRefuteCount: number; + refutationGamesCount: number; + activeRefutationGamesCount: number; + firstActivity: number | nullish; + firstActivityTime: string | nullish; + lastActivity: number | nullish; + lastActivityTime: string | nullish; +} + +interface TzktDelegateAccount extends TzktAccountBase { + type: TzktAccountType.Delegate; + id: number; + active: boolean; + publicKey: string | nullish; + revealed: boolean; + balance: number; + rollupBonds: number; + smartRollupBonds: number; + frozenDeposit: number; + frozenDepositLimit: number | nullish; + counter: number; + activationLevel: number; + activationTime: string; + deactivationLevel: number | nullish; + deactivationTime: string | nullish; + stakingBalance: number; + delegatedBalance: number; + numContracts: number; + rollupsCount: number; + smartRollupsCount: number; + activeTokensCount: number; + tokenBalancesCount: number; + tokenTransfersCount: number; + numDelegators: number; + numBlocks: number; + numEndorsements: number; + numPreendorsements: number; + numBallots: number; + numProposals: number; + numActivations: number; + numDoubleBaking: number; + numDoubleEndorsing: number; + numDoublePreendorsing: number; + numNonceRevelations: number; + vdfRevelationsCount: number; + numRevelationPenalties: number; + numEndorsingRewards: number; + numDelegations: number; + numOriginations: number; + numTransactions: number; + numReveals: number; + numRegisterConstants: number; + numSetDepositsLimits: number; + numMigrations: number; + txRollupOriginationCount: number; + txRollupSubmitBatchCount: number; + txRollupCommitCount: number; + txRollupReturnBondCount: number; + txRollupFinalizeCommitmentCount: number; + txRollupRemoveCommitmentCount: number; + txRollupRejectionCount: number; + txRollupDispatchTicketsCount: number; + transferTicketCount: number; + increasePaidStorageCount: number; + updateConsensusKeyCount: number; + drainDelegateCount: number; + smartRollupAddMessagesCount: number; + smartRollupCementCount: number; + smartRollupExecuteCount: number; + smartRollupOriginateCount: number; + smartRollupPublishCount: number; + smartRollupRecoverBondCount: number; + smartRollupRefuteCount: number; + refutationGamesCount: number; + activeRefutationGamesCount: number; + firstActivity: number; + firstActivityTime: string | nullish; + lastActivity: number; + lastActivityTime: string | nullish; + extras: unknown; + software: { date: string; version: string | nullish }; +} + +interface TzktContractAccount extends TzktAccountBase { + type: TzktAccountType.Contract; + id: number; + kind: 'delegator_contract' | 'smart_contract' | nullish; + tzips: string[] | nullish; + balance: number; + creator: TzktAlias | nullish; + manager: TzktAlias | nullish; + delegate: TzktAlias | nullish; + delegationLevel: number | nullish; + delegationTime: string | nullish; + numContracts: number; + activeTokensCount: number; + tokensCount: number; + tokenBalancesCount: number; + tokenTransfersCount: number; + numDelegations: number; + numOriginations: number; + numTransactions: number; + numReveals: number; + numMigrations: number; + transferTicketCount: number; + increasePaidStorageCount: number; + eventsCount: number; + firstActivity: number; + firstActivityTime: string; + lastActivity: number; + lastActivityTime: string; + typeHash: number; + codeHash: number; + /** TZIP-16 metadata (with ?legacy=true this field will contain tzkt profile info). */ + metadata: unknown; + extras: unknown; + /** Contract storage value. Omitted by default. Use ?includeStorage=true to include it into response. */ + storage: unknown; +} + +interface TzktGhostAccount extends TzktAccountBase { + type: TzktAccountType.Ghost; + id: number; + activeTokensCount: number; + tokenBalancesCount: number; + tokenTransfersCount: number; + firstActivity: number; + firstActivityTime: string; + lastActivity: number; + lastActivityTime: string; + extras: unknown; +} + +interface TzktRollupAccount extends TzktAccountBase { + type: TzktAccountType.Rollup; + id: number; + creator: TzktAlias | nullish; + rollupBonds: number; + activeTokensCount: number; + tokenBalancesCount: number; + tokenTransfersCount: number; + numTransactions: number; + txRollupOriginationCount: number; + txRollupSubmitBatchCount: number; + txRollupCommitCount: number; + txRollupReturnBondCount: number; + txRollupFinalizeCommitmentCount: number; + txRollupRemoveCommitmentCount: number; + txRollupRejectionCount: number; + txRollupDispatchTicketsCount: number; + transferTicketCount: number; + firstActivity: number; + firstActivityTime: string; + lastActivity: number; + lastActivityTime: string; + extras: unknown; +} + +interface TzktSmartRollupAccount extends TzktAccountBase { + type: TzktAccountType.SmartRollup; + id: number; + creator: TzktAlias | nullish; + pvmKind: 'arith' | 'wasm' | nullish; + genesisCommitment: string | nullish; + lastCommitment: string | nullish; + inboxLevel: number; + totalStakers: number; + activeStakers: number; + executedCommitments: number; + cementedCommitments: number; + pendingCommitments: number; + refutedCommitments: number; + orphanCommitments: number; + smartRollupBonds: number; + activeTokensCount: number; + tokenBalancesCount: number; + tokenTransfersCount: number; + numTransactions: number; + transferTicketCount: number; + smartRollupCementCount: number; + smartRollupExecuteCount: number; + smartRollupOriginateCount: number; + smartRollupPublishCount: number; + smartRollupRecoverBondCount: number; + smartRollupRefuteCount: number; + refutationGamesCount: number; + activeRefutationGamesCount: number; + firstActivity: number; + firstActivityTime: string; + lastActivity: number; + lastActivityTime: string; + extras: unknown; +} + +interface TzktEmptyAccount extends TzktAccountBase { + type: TzktAccountType.Empty; + alias: undefined; + counter: number; +} + +export type TzktAccount = + | TzktUserAccount + | TzktDelegateAccount + | TzktContractAccount + | TzktGhostAccount + | TzktRollupAccount + | TzktSmartRollupAccount + | TzktEmptyAccount; diff --git a/src/lib/temple/front/baking.ts b/src/lib/temple/front/baking.ts index dc1d37fc4e..34fbfdec82 100644 --- a/src/lib/temple/front/baking.ts +++ b/src/lib/temple/front/baking.ts @@ -1,30 +1,80 @@ import { useCallback, useMemo } from 'react'; +import retry from 'async-retry'; import BigNumber from 'bignumber.js'; +import useSWR, { unstable_serialize, useSWRConfig } from 'swr'; +import { BoundaryError } from 'app/ErrorBoundary'; import { BakingBadBaker, BakingBadBakerValueHistoryItem, bakingBadGetBaker, getAllBakersBakingBad } from 'lib/apis/baking-bad'; -import type { TzktRewardsEntry } from 'lib/apis/tzkt'; +import { getAccountStatsFromTzkt, isKnownChainId, TzktRewardsEntry, TzktAccountType } from 'lib/apis/tzkt'; +import { t } from 'lib/i18n'; import { useRetryableSWR } from 'lib/swr'; +import type { ReactiveTezosToolkit } from 'lib/temple/front'; -import { useNetwork, useTezos } from './ready'; +import { getOnlineStatus } from './get-online-status'; +import { useChainId, useNetwork, useTezos } from './ready'; -export function useDelegate(address: string, suspense = true) { +function getDelegateCacheKey( + tezos: ReactiveTezosToolkit, + address: string, + chainId: string | nullish, + shouldPreventErrorPropagation: boolean +) { + return unstable_serialize(['delegate', tezos.checksum, address, chainId, shouldPreventErrorPropagation]); +} + +export function useDelegate(address: string, suspense = true, shouldPreventErrorPropagation = true) { const tezos = useTezos(); + const chainId = useChainId(suspense); + const { cache: swrCache } = useSWRConfig(); + + const resetDelegateCache = useCallback(() => { + swrCache.delete(getDelegateCacheKey(tezos, address, chainId, shouldPreventErrorPropagation)); + }, [address, tezos, chainId, swrCache, shouldPreventErrorPropagation]); const getDelegate = useCallback(async () => { try { - return await tezos.rpc.getDelegate(address); - } catch { - return null; + return await retry( + async () => { + const freshChainId = chainId ?? (await tezos.rpc.getChainId()); + if (freshChainId && isKnownChainId(freshChainId)) { + try { + const accountStats = await getAccountStatsFromTzkt(address, freshChainId); + + switch (accountStats.type) { + case TzktAccountType.Empty: + return null; + case TzktAccountType.User: + case TzktAccountType.Contract: + return accountStats.delegate?.address ?? null; + } + } catch (e) { + console.error(e); + } + } + + return await tezos.rpc.getDelegate(address); + }, + { retries: 3, minTimeout: 3000, maxTimeout: 5000 } + ); + } catch (e) { + if (shouldPreventErrorPropagation) { + return null; + } + + throw new BoundaryError( + getOnlineStatus() ? t('errorGettingBakerAddressMessageOnline') : t('errorGettingBakerAddressMessage'), + resetDelegateCache + ); } - }, [address, tezos]); + }, [chainId, tezos, address, shouldPreventErrorPropagation, resetDelegateCache]); - return useRetryableSWR(['delegate', tezos.checksum, address], getDelegate, { + return useSWR(['delegate', tezos.checksum, address, chainId, shouldPreventErrorPropagation], getDelegate, { dedupingInterval: 20_000, suspense }); diff --git a/src/lib/temple/front/blockexplorer.ts b/src/lib/temple/front/blockexplorer.ts index 526d1473e1..ac1455c03b 100644 --- a/src/lib/temple/front/blockexplorer.ts +++ b/src/lib/temple/front/blockexplorer.ts @@ -41,18 +41,19 @@ export const BLOCK_EXPLORERS: BlockExplorer[] = [ } ], [ - TempleChainId.Jakartanet, + TempleChainId.Mumbai, { - account: 'https://jakartanet.tzkt.io', - transaction: 'https://jakartanet.tzkt.io' + account: 'https://mumbainet.tzkt.io', + transaction: 'https://mumbainet.tzkt.io', + api: 'https://api.mumbainet.tzkt.io' } ], [ - TempleChainId.Limanet, + TempleChainId.Nairobi, { - account: 'https://limanet.tzkt.io', - transaction: 'https://limanet.tzkt.io', - api: 'https://api.limanet.tzkt.io' + account: 'https://nairobinet.tzkt.io', + transaction: 'https://nairobinet.tzkt.io', + api: 'https://api.nairobinet.tzkt.io' } ] ]) @@ -72,8 +73,9 @@ export const BLOCK_EXPLORERS: BlockExplorer[] = [ [ TempleChainId.DcpTest, { - account: 'https://explorer.tlnt.net:444', - transaction: 'https://explorer.tlnt.net:444' + account: 'https://explorer.test.tlnt.net', + transaction: 'https://explorer.test.tlnt.net', + api: 'https://explorer-api.test.tlnt.net' } ] ]) diff --git a/src/lib/temple/front/get-online-status.ts b/src/lib/temple/front/get-online-status.ts new file mode 100644 index 0000000000..f4c90705b8 --- /dev/null +++ b/src/lib/temple/front/get-online-status.ts @@ -0,0 +1,3 @@ +export function getOnlineStatus() { + return typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean' ? navigator.onLine : true; +} diff --git a/src/lib/temple/front/index.ts b/src/lib/temple/front/index.ts index eb287572bf..277bc14cd9 100644 --- a/src/lib/temple/front/index.ts +++ b/src/lib/temple/front/index.ts @@ -64,3 +64,5 @@ export { buildCollectibleImageURLs, buildObjktCollectibleArtifactUri } from './image-uri'; + +export { getOnlineStatus } from './get-online-status'; diff --git a/src/lib/temple/networks.ts b/src/lib/temple/networks.ts index 6b7f055ccf..0ae1f04ea3 100644 --- a/src/lib/temple/networks.ts +++ b/src/lib/temple/networks.ts @@ -13,9 +13,8 @@ const getLastMonday = (date = new Date()) => { export const NETWORK_IDS = new Map([ [TempleChainId.Mainnet, 'mainnet'], [TempleChainId.Ghostnet, 'ghostnet'], - [TempleChainId.Jakartanet, 'jakartanet'], - [TempleChainId.Limanet, 'limanet'], - [TempleChainId.Kathmandunet, 'kathmandunet'] + [TempleChainId.Mumbai, 'mumbainet'], + [TempleChainId.Nairobi, 'nairobinet'] ]); const DCP_NETWORKS: TempleNetwork[] = [ @@ -49,6 +48,15 @@ export const NETWORKS: TempleNetwork[] = [ color: '#83b300', disabled: false }, + { + id: 'marigold-mainnet', + nameI18nKey: 'marigoldMainnet', + description: 'Marigold mainnet', + type: 'main', + rpcBaseURL: 'https://mainnet.tezos.marigold.dev', + color: '#48bb78', + disabled: false + }, { id: 'smartpy-mainnet', name: 'SmartPy Mainnet', diff --git a/src/lib/temple/types.ts b/src/lib/temple/types.ts index f0631e2a8a..2f4adab0ca 100644 --- a/src/lib/temple/types.ts +++ b/src/lib/temple/types.ts @@ -39,10 +39,9 @@ export interface TempleState { export enum TempleChainId { Mainnet = 'NetXdQprcVkpaWU', Ghostnet = 'NetXnHfVqm9iesp', - Jakartanet = 'NetXLH1uAxK7CCh', - Limanet = 'NetXizpkH94bocH', - Kathmandunet = 'NetXdnUSgMs7Xc3', Monday = 'NetXaqtQ8b5nihx', + Mumbai = 'NetXgbcrNtXD2yA', + Nairobi = 'NetXyuzvDo2Ugzb', Daily = 'NetXxkAx4woPLyu', Dcp = 'NetXooyhiru73tk', DcpTest = 'NetXX7Tz1sK8JTa'