diff --git a/src/components/DaoList.tsx b/src/components/DaoList.tsx index dd42283..03ed451 100644 --- a/src/components/DaoList.tsx +++ b/src/components/DaoList.tsx @@ -1,12 +1,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import ProjectCard from './ProjectCard'; import LoadingSpinner from './LoadingSpinner'; -import { ChainPropertiesType, CoreEraStakeInfoType, CoreIndexedRewardsType, StakingCore, TotalRewardsCoreClaimedQuery, TotalUserStakedData, UserStakedInfoType, getTotalUserStaked } from '../routes/staking'; +import { ChainPropertiesType, DaoEraStakeInfoType, DaoIndexedRewardsType, StakingDao, TotalRewardsDaoClaimedQuery, TotalUserStakedData, UserStakedInfoType, getTotalUserStaked } from '../routes/staking'; import { AnyJson, Codec } from '@polkadot/types/types'; import { StakedDaoType } from '../routes/overview'; import BigNumber from 'bignumber.js'; import { InjectedAccountWithMeta } from '@polkadot/extension-inject/types'; -import { loadProjectCores, loadStakedDaos } from '../utils/stakingServices'; +import { loadProjectDaos, loadStakedDaos } from '../utils/stakingServices'; import useApi from '../hooks/useApi'; import { toast } from 'react-hot-toast'; import useAccount from '../stores/account'; @@ -25,7 +25,7 @@ interface DaoListProps { mini: boolean; isOverview: boolean; totalStakedInSystem const DaoList = (props: DaoListProps) => { const { mini, isOverview, totalStakedInSystem } = props; const api = useApi(); - const initialCoresRef = useRef([]); + const initialDaosRef = useRef([]); const descriptionRef = useRef(null); const projectCardRef = useRef(null); const setOpenModal = useModal((state) => state.setOpenModal); @@ -34,10 +34,10 @@ const DaoList = (props: DaoListProps) => { const [isLoading, setLoading] = useState(true); const [isDataLoaded, setDataLoaded] = useState(false); const [stakedDaos, setStakedDaos] = useState([]); - const [stakingCores, setStakingCores] = useState([]); + const [stakingDaos, setStakingDaos] = useState([]); const [chainProperties, setChainProperties] = useState(); - const [coreEraStakeInfo, setCoreEraStakeInfo] = useState([]); - const [coreIndexedRewards, setCoreIndexedRewards] = useState([]); + const [daoEraStakeInfo, setDaoEraStakeInfo] = useState([]); + const [daoIndexedRewards, setDaoIndexedRewards] = useState([]); const [totalUserStakedData, setTotalUserStakedData] = useState({}); const [userStakedInfo, setUserStakedInfo] = useState([]); @@ -47,22 +47,22 @@ const DaoList = (props: DaoListProps) => { const [activeFilterCount, setActiveFilterCount] = useState(0); const [rewardsCoreClaimedQuery] = useQuery({ - query: TotalRewardsCoreClaimedQuery, + query: TotalRewardsDaoClaimedQuery, variables: {}, pause: !selectedAccount, }); - const handleViewMembers = (core: StakingCore, members: AnyJson[]) => { + const handleViewMembers = (dao: StakingDao, members: AnyJson[]) => { setOpenModal({ name: modalName.MEMBERS, - metadata: { ...core.metadata, members }, + metadata: { ...dao.metadata, members }, }); }; - const handleReadMore = (core: StakingCore) => { + const handleReadMore = (dao: StakingDao) => { setOpenModal({ name: modalName.READ_MORE, - metadata: core.metadata, + metadata: dao.metadata, }); }; @@ -74,15 +74,15 @@ const DaoList = (props: DaoListProps) => { }; const filterStakingCores = useCallback((filters: FilterStates) => { - let cores = [...initialCoresRef.current]; + let daos = [...initialDaosRef.current]; let activeFilterCount = 0; // Filter by total stakers if (filters.totalStakersRange.minValue > 0 || filters.totalStakersRange.maxValue < 1000) { activeFilterCount++; - cores = cores.filter(core => { - const coreInfo = coreEraStakeInfo.find(info => info.coreId === core.key); - const totalStakers = coreInfo ? coreInfo.numberOfStakers : 0; + daos = daos.filter(core => { + const daoInfo = daoEraStakeInfo.find(info => info.daoId === core.key); + const totalStakers = daoInfo ? daoInfo.numberOfStakers : 0; return totalStakers >= filters.totalStakersRange.minValue && totalStakers <= filters.totalStakersRange.maxValue; }); } @@ -90,7 +90,7 @@ const DaoList = (props: DaoListProps) => { // Filter by total staked if (filters.totalStakedRange.minValue > 0 || filters.totalStakedRange.maxValue < 99999) { activeFilterCount++; - cores = cores.filter(core => { + daos = daos.filter(core => { const totalStaked = totalUserStakedData[core.key]?.dividedBy(1e12).toNumber() || 0; if (filters.totalStakedRange.maxValue === 99999) { return totalStaked >= filters.totalStakedRange.minValue; @@ -103,16 +103,16 @@ const DaoList = (props: DaoListProps) => { // Filter by min support met if (filters.isMinSupportMet.isIndeterminate) { activeFilterCount++; - cores = cores.filter(core => { - const coreInfo = coreEraStakeInfo.find(info => info.coreId === core.key); - const totalStaked = coreInfo ? new BigNumber(coreInfo.totalStaked) : new BigNumber(0); + daos = daos.filter(core => { + const daoInfo = daoEraStakeInfo.find(info => info.daoId === core.key); + const totalStaked = daoInfo ? new BigNumber(daoInfo.totalStaked) : new BigNumber(0); return totalStaked.comparedTo(minStakeReward) < 0; }); } else if (filters.isMinSupportMet.isChecked) { activeFilterCount++; - cores = cores.filter(core => { - const coreInfo = coreEraStakeInfo.find(info => info.coreId === core.key); - const totalStaked = coreInfo ? new BigNumber(coreInfo.totalStaked) : new BigNumber(0); + daos = daos.filter(core => { + const daoInfo = daoEraStakeInfo.find(info => info.daoId === core.key); + const totalStaked = daoInfo ? new BigNumber(daoInfo.totalStaked) : new BigNumber(0); return totalStaked.comparedTo(minStakeReward) >= 0; }); } @@ -120,13 +120,13 @@ const DaoList = (props: DaoListProps) => { // Filter by my staked DAOs if (filters.isMyStakedDAOs.isIndeterminate) { activeFilterCount++; - cores = cores.filter(core => { + daos = daos.filter(core => { const userStaked = totalUserStakedData[core.key] ?? new BigNumber(0); return userStaked.isEqualTo(0); }); } else if (filters.isMyStakedDAOs.isChecked) { activeFilterCount++; - cores = cores.filter(core => { + daos = daos.filter(core => { const userStaked = totalUserStakedData[core.key] ?? new BigNumber(0); return userStaked.isGreaterThan(0); }); @@ -137,47 +137,47 @@ const DaoList = (props: DaoListProps) => { activeFilterCount++; switch (filters.orderBy) { case OrderByOption.NAME_ASCENDING: - cores = cores.sort((a, b) => a.metadata.name.localeCompare(b.metadata.name)); + daos = daos.sort((a, b) => a.metadata.name.localeCompare(b.metadata.name)); break; case OrderByOption.NAME_DESCENDING: - cores = cores.sort((a, b) => b.metadata.name.localeCompare(a.metadata.name)); + daos = daos.sort((a, b) => b.metadata.name.localeCompare(a.metadata.name)); break; case OrderByOption.TOTAL_STAKED_HIGH: - cores = cores.sort((a, b) => { - const aCoreInfo = coreEraStakeInfo.find(info => info.coreId === a.key); - const bCoreInfo = coreEraStakeInfo.find(info => info.coreId === b.key); - const aTotalStaked = new BigNumber(aCoreInfo?.totalStaked ?? 0); - const bTotalStaked = new BigNumber(bCoreInfo?.totalStaked ?? 0); + daos = daos.sort((a, b) => { + const aDaoInfo = daoEraStakeInfo.find(info => info.daoId === a.key); + const bDaoInfo = daoEraStakeInfo.find(info => info.daoId === b.key); + const aTotalStaked = new BigNumber(aDaoInfo?.totalStaked ?? 0); + const bTotalStaked = new BigNumber(bDaoInfo?.totalStaked ?? 0); return bTotalStaked.comparedTo(aTotalStaked); }); break; case OrderByOption.TOTAL_STAKED_LOW: - cores = cores.sort((a, b) => { - const aCoreInfo = coreEraStakeInfo.find(info => info.coreId === a.key); - const bCoreInfo = coreEraStakeInfo.find(info => info.coreId === b.key); - const aTotalStaked = new BigNumber(aCoreInfo?.totalStaked ?? 0); - const bTotalStaked = new BigNumber(bCoreInfo?.totalStaked ?? 0); + daos = daos.sort((a, b) => { + const aDaoInfo = daoEraStakeInfo.find(info => info.daoId === a.key); + const bDaoInfo = daoEraStakeInfo.find(info => info.daoId === b.key); + const aTotalStaked = new BigNumber(aDaoInfo?.totalStaked ?? 0); + const bTotalStaked = new BigNumber(bDaoInfo?.totalStaked ?? 0); return aTotalStaked.comparedTo(bTotalStaked); }); break; case OrderByOption.SUPPORT_SHARE_HIGH: - cores = cores.sort((a, b) => { - const aCoreInfo = coreEraStakeInfo.find(info => info.coreId === a.key); - const aTotalStaked = aCoreInfo ? new BigNumber(aCoreInfo.totalStaked) : new BigNumber(0); + daos = daos.sort((a, b) => { + const aDaoInfo = daoEraStakeInfo.find(info => info.daoId === a.key); + const aTotalStaked = aDaoInfo ? new BigNumber(aDaoInfo.totalStaked) : new BigNumber(0); const aSupportShare = aTotalStaked.dividedBy(minStakeReward).multipliedBy(100); - const bCoreInfo = coreEraStakeInfo.find(info => info.coreId === b.key); - const bTotalStaked = bCoreInfo ? new BigNumber(bCoreInfo.totalStaked) : new BigNumber(0); + const bDaoInfo = daoEraStakeInfo.find(info => info.daoId === b.key); + const bTotalStaked = bDaoInfo ? new BigNumber(bDaoInfo.totalStaked) : new BigNumber(0); const bSupportShare = bTotalStaked.dividedBy(minStakeReward).multipliedBy(100); return bSupportShare.minus(aSupportShare).toNumber(); }); break; case OrderByOption.SUPPORT_SHARE_LOW: - cores = cores.sort((a, b) => { - const aCoreInfo = coreEraStakeInfo.find(info => info.coreId === a.key); - const aTotalStaked = aCoreInfo ? new BigNumber(aCoreInfo.totalStaked) : new BigNumber(0); + daos = daos.sort((a, b) => { + const aDaoInfo = daoEraStakeInfo.find(info => info.daoId === a.key); + const aTotalStaked = aDaoInfo ? new BigNumber(aDaoInfo.totalStaked) : new BigNumber(0); const aSupport = aTotalStaked.dividedBy(minStakeReward).multipliedBy(100); - const bCoreInfo = coreEraStakeInfo.find(info => info.coreId === b.key); - const bTotalStaked = bCoreInfo ? new BigNumber(bCoreInfo.totalStaked) : new BigNumber(0); + const bDaoInfo = daoEraStakeInfo.find(info => info.daoId === b.key); + const bTotalStaked = bDaoInfo ? new BigNumber(bDaoInfo.totalStaked) : new BigNumber(0); const bSupport = bTotalStaked.dividedBy(minStakeReward).multipliedBy(100); return aSupport.minus(bSupport).toNumber(); }); @@ -188,9 +188,9 @@ const DaoList = (props: DaoListProps) => { } } - setStakingCores(cores); + setStakingDaos(daos); setActiveFilterCount(activeFilterCount); - }, [initialCoresRef, coreEraStakeInfo, totalUserStakedData, minStakeReward]); + }, [initialDaosRef, daoEraStakeInfo, totalUserStakedData, minStakeReward]); const updateFilters = useCallback((filters: FilterStates) => { filterStakingCores(filters); @@ -205,13 +205,13 @@ const DaoList = (props: DaoListProps) => { }; const handleManageStaking = async ({ - core, + dao: core, totalUserStaked, - allCores + allDaos }: StakingMetadata) => { setOpenModal({ name: modalName.MANAGE_STAKING, - metadata: { ...core, totalUserStaked, stakingCores, totalUserStakedData, allCores }, + metadata: { ...core, totalUserStaked, stakingDaos, totalUserStakedData, allDaos }, }); }; @@ -223,13 +223,13 @@ const DaoList = (props: DaoListProps) => { const newTimeout = setTimeout(() => { if (value === '') { - setStakingCores(initialCoresRef.current); + setStakingDaos(initialDaosRef.current); } else { - const filteredCores = initialCoresRef.current.filter(core => + const filteredCores = initialDaosRef.current.filter(core => core.metadata.name.toLowerCase().includes(value) || (core.metadata.description && core.metadata.description.toLowerCase().includes(value)) ); - setStakingCores(filteredCores); + setStakingDaos(filteredCores); } }, 300); @@ -237,50 +237,50 @@ const DaoList = (props: DaoListProps) => { }; const loadStakeRewardMinimum = useCallback(() => { - const minStakeReward = api.consts.ocifStaking.stakeThresholdForActiveCore.toPrimitive() as string; + const minStakeReward = api.consts.ocifStaking.stakeThresholdForActiveDao.toPrimitive() as string; setMinStakeReward(new BigNumber(minStakeReward)); }, [api]); const loadCores = useCallback(async () => { if (!selectedAccount) return; - const cores = await loadProjectCores(api); - if (cores) { - initialCoresRef.current = cores; - setStakingCores(cores); + const daos = await loadProjectDaos(api); + if (daos) { + initialDaosRef.current = daos; + setStakingDaos(daos); } }, [selectedAccount, api]); const loadTotalUserStaked = useCallback(() => { - if (!coreEraStakeInfo.length || !userStakedInfo.length) { + if (!daoEraStakeInfo.length || !userStakedInfo.length) { return; } setTotalUserStakedData(prevState => { const totalUserStakedResults: TotalUserStakedData = { ...prevState }; - for (const core of initialCoresRef.current) { + for (const core of initialDaosRef.current) { const totalUserStaked = getTotalUserStaked(userStakedInfo, core); totalUserStakedResults[core.key] = totalUserStaked; } return totalUserStakedResults; }); - }, [coreEraStakeInfo, userStakedInfo]); + }, [daoEraStakeInfo, userStakedInfo]); const loadStakingConstants = useCallback(async () => { - const maxStakersPerCore = api.consts.ocifStaking.maxStakersPerCore.toPrimitive() as number; + const maxStakersPerDao = api.consts.ocifStaking.maxStakersPerDao.toPrimitive() as number; const inflationErasPerYear = api.consts.checkedInflation.erasPerYear.toPrimitive() as number; - setChainProperties({ maxStakersPerCore, inflationErasPerYear }); + setChainProperties({ maxStakersPerDao, inflationErasPerYear }); }, [api]); const loadCoreEraStake = useCallback(async () => { - const coreEraStakeInfoMap: Map = new Map(); + const daoEraStakeInfoMap: Map = new Map(); const currentEra = await api.query.ocifStaking.currentEra(); - if (coreEraStakeInfo.length === 0) { - for (const stakingCore of stakingCores) { - await api.query.ocifStaking.coreEraStake(stakingCore.key, currentEra, (inf: Codec) => { + if (daoEraStakeInfo.length === 0) { + for (const stakingDao of stakingDaos) { + await api.query.ocifStaking.coreEraStake(stakingDao.key, currentEra, (inf: Codec) => { const info: { total: string; @@ -294,20 +294,20 @@ const DaoList = (props: DaoListProps) => { active: boolean; }; - coreEraStakeInfoMap.set(stakingCore.key, { + daoEraStakeInfoMap.set(stakingDao.key, { totalStaked: info.total, active: info.active, rewardClaimed: info.rewardClaimed, numberOfStakers: info.numberOfStakers, - coreId: stakingCore.key + daoId: stakingDao.key }); - const coreEraStake = Array.from(coreEraStakeInfoMap.values()); - setCoreEraStakeInfo(coreEraStake); + const coreEraStake = Array.from(daoEraStakeInfoMap.values()); + setDaoEraStakeInfo(coreEraStake); }); } } - }, [stakingCores, coreEraStakeInfo.length, api]); + }, [stakingDaos, daoEraStakeInfo.length, api]); const initializeData = useCallback(async (selectedAccount: InjectedAccountWithMeta | null) => { try { @@ -320,7 +320,7 @@ const DaoList = (props: DaoListProps) => { } } catch (error) { - toast.error(`${ error }`); + toast.error(`${error}`); } finally { setLoading(false); setDataLoaded(true); @@ -332,8 +332,8 @@ const DaoList = (props: DaoListProps) => { throw new Error("selectedAccount is null"); }; - const coreEraStakeInfoMap: Map< - number, CoreEraStakeInfoType> = new Map(); + const daoEraStakeInfoMap: Map< + number, DaoEraStakeInfoType> = new Map(); const userStakedInfoMap: Map< number, UserStakedInfoType @@ -341,8 +341,8 @@ const DaoList = (props: DaoListProps) => { const currentEra = await api.query.ocifStaking.currentEra(); - for (const stakingCore of initialCoresRef.current) { - await api.query.ocifStaking.coreEraStake(stakingCore.key, currentEra, (inf: Codec) => { + for (const stakingDao of initialDaosRef.current) { + await api.query.ocifStaking.coreEraStake(stakingDao.key, currentEra, (inf: Codec) => { const info: { total: string; @@ -356,23 +356,23 @@ const DaoList = (props: DaoListProps) => { active: boolean; }; - coreEraStakeInfoMap.set(stakingCore.key, { + daoEraStakeInfoMap.set(stakingDao.key, { totalStaked: info.total, active: info.active, rewardClaimed: info.rewardClaimed, numberOfStakers: info.numberOfStakers, - coreId: stakingCore.key + daoId: stakingDao.key }); - const coreEraStake = Array.from(coreEraStakeInfoMap.values()); - setCoreEraStakeInfo(coreEraStake); + const coreEraStake = Array.from(daoEraStakeInfoMap.values()); + setDaoEraStakeInfo(coreEraStake); }); } - for (const stakingCore of initialCoresRef.current) { + for (const stakingDao of initialDaosRef.current) { await api.query.ocifStaking.generalStakerInfo( - stakingCore.key, + stakingDao.key, selectedAccount.address, (generalStakerInfo: Codec) => { const info = generalStakerInfo.toPrimitive() as StakesInfo; @@ -386,8 +386,8 @@ const DaoList = (props: DaoListProps) => { staked = new BigNumber(latestInfo.staked); } - userStakedInfoMap.set(stakingCore.key, { - coreId: stakingCore.key, + userStakedInfoMap.set(stakingDao.key, { + daoId: stakingDao.key, era: era, staked: staked, }); @@ -409,7 +409,7 @@ const DaoList = (props: DaoListProps) => { setup(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedAccount, stakingCores]); + }, [selectedAccount, stakingDaos]); useEffect(() => { initializeData(selectedAccount); @@ -419,34 +419,34 @@ const DaoList = (props: DaoListProps) => { useEffect(() => { loadTotalUserStaked(); - }, [loadTotalUserStaked, coreEraStakeInfo, userStakedInfo, selectedAccount]); + }, [loadTotalUserStaked, daoEraStakeInfo, userStakedInfo, selectedAccount]); useEffect(() => { const loadDaos = async () => { if (!selectedAccount) return; - const daos = await loadStakedDaos(stakingCores, selectedAccount.address, api); + const daos = await loadStakedDaos(stakingDaos, selectedAccount.address, api); setStakedDaos(daos); }; if (!selectedAccount) return; - if (!stakingCores) return; + if (!stakingDaos) return; loadDaos(); - }, [selectedAccount, stakingCores, api]); + }, [selectedAccount, stakingDaos, api]); useEffect(() => { - if (!rewardsCoreClaimedQuery.data?.cores?.length || !selectedAccount) return; + if (!rewardsCoreClaimedQuery.data?.daos?.length || !selectedAccount) return; - const coreIndexedRewardsMap: CoreIndexedRewardsType[] = rewardsCoreClaimedQuery.data.cores; + const daoIndexedRewardsMap: DaoIndexedRewardsType[] = rewardsCoreClaimedQuery.data.daos; - const uniqueCoreIndexedRewards = coreIndexedRewardsMap.filter((core, index, self) => - index === self.findIndex((item) => item.coreId === core.coreId) + const uniquedaoIndexedRewards = daoIndexedRewardsMap.filter((core, index, self) => + index === self.findIndex((item) => item.daoId === core.daoId) ); - setCoreIndexedRewards(uniqueCoreIndexedRewards); - }, [selectedAccount, stakingCores, rewardsCoreClaimedQuery.data]); + setDaoIndexedRewards(uniquedaoIndexedRewards); + }, [selectedAccount, stakingDaos, rewardsCoreClaimedQuery.data]); useEffect(() => { return () => { @@ -456,17 +456,17 @@ const DaoList = (props: DaoListProps) => { useEffect(() => { if (searchTerm === '') { - setStakingCores(initialCoresRef.current); + setStakingDaos(initialDaosRef.current); } }, [searchTerm]); const stakedCoresCount = useMemo(() => { return isOverview - ? stakingCores.filter(core => + ? stakingDaos.filter(core => totalUserStakedData[core.key] && (totalUserStakedData[core.key] as BigNumber).isGreaterThan(0) ).length - : stakingCores.length; - }, [isOverview, stakingCores, totalUserStakedData]); + : stakingDaos.length; + }, [isOverview, stakingDaos, totalUserStakedData]); const loadingSpinner =
@@ -494,10 +494,10 @@ const DaoList = (props: DaoListProps) => {
- {stakingCores.map((core: StakingCore) => { - const coreInfo = coreEraStakeInfo.find((info) => info.coreId === core.key); - const coreRewards = coreIndexedRewards.find((info) => info.coreId === core.key); - const userStaked = totalUserStakedData[core.key] ? totalUserStakedData[core.key] : new BigNumber(0); + {stakingDaos.map((dao: StakingDao) => { + const daoInfo = daoEraStakeInfo.find((info) => info.daoId === dao.key); + const coreRewards = daoIndexedRewards.find((info) => info.daoId === dao.key); + const userStaked = totalUserStakedData[dao.key] ? totalUserStakedData[dao.key] : new BigNumber(0); // If userStaked is zero, don't render the card if (isOverview && userStaked && userStaked.isEqualTo(0)) { @@ -507,10 +507,10 @@ const DaoList = (props: DaoListProps) => { const projectCard = (minified: boolean) => ( dao.key === core.key)?.members as AnyJson[] || []} - core={core} + members={stakedDaos.find((dao) => dao.key === dao.key)?.members as AnyJson[] || []} + dao={dao} totalUserStaked={userStaked} - coreInfo={coreInfo} + daoInfo={daoInfo} coreRewards={coreRewards} handleManageStaking={handleManageStaking} handleViewDetails={(mini) => handleViewDetails(mini, projectCard(false))} @@ -521,12 +521,12 @@ const DaoList = (props: DaoListProps) => { descriptionRef={minified ? projectCardRef : descriptionRef} selectedAccount={selectedAccount} totalStakedInSystem={totalStakedInSystem || new BigNumber(0)} - allCores={initialCoresRef.current} + allDaos={initialDaosRef.current} /> ); return ( -
+
{projectCard(mini)}
); diff --git a/src/components/ProjectCard.tsx b/src/components/ProjectCard.tsx index 12b6747..64d26e8 100644 --- a/src/components/ProjectCard.tsx +++ b/src/components/ProjectCard.tsx @@ -2,7 +2,7 @@ import { RefObject, useCallback, useEffect, useRef, useState } from 'react'; import { BigNumber } from 'bignumber.js'; import { LockClosedIcon } from '@heroicons/react/24/outline'; import toast from 'react-hot-toast'; -import { StakingCore, CoreEraStakeInfoType, ChainPropertiesType, CoreIndexedRewardsType } from '../routes/staking'; +import { StakingDao, DaoEraStakeInfoType, ChainPropertiesType, DaoIndexedRewardsType } from '../routes/staking'; import { InjectedAccountWithMeta } from '@polkadot/extension-inject/types'; import TotalStakersIcon from '../assets/total-stakers-icon.svg'; import TotalStakedIcon from '../assets/total-staked-icon.svg'; @@ -22,31 +22,31 @@ import { web3Enable, web3FromAddress } from "@polkadot/extension-dapp"; import { getSignAndSendCallbackWithPromise } from "../utils/getSignAndSendCallback"; export interface ProjectCardProps { - core: StakingCore; + dao: StakingDao; totalUserStaked: BigNumber | undefined; - coreInfo: Partial | undefined; - coreRewards: Partial | undefined; + daoInfo: Partial | undefined; + coreRewards: Partial | undefined; chainProperties: ChainPropertiesType | undefined; availableBalance: BigNumber | undefined; handleManageStaking: (args: StakingMetadata) => void; handleViewDetails?: (mini: boolean) => void; descriptionRef: RefObject; - toggleExpanded: (core: StakingCore) => void; - toggleViewMembers: (core: StakingCore, members: AnyJson[]) => void; + toggleExpanded: (dao: StakingDao) => void; + toggleViewMembers: (dao: StakingDao, members: AnyJson[]) => void; selectedAccount: InjectedAccountWithMeta | null; members: AnyJson[]; mini: boolean; totalStakedInSystem: BigNumber; - allCores: StakingCore[]; + allDaos: StakingDao[]; } const STAT_UNDERLINE = `border-b border-b-[#2B2C30]`; const ProjectCard = (props: ProjectCardProps) => { const { - core, + dao: core, totalUserStaked: totalStaked, - coreInfo, + daoInfo, coreRewards, chainProperties, // availableBalance, @@ -59,7 +59,7 @@ const ProjectCard = (props: ProjectCardProps) => { members, mini, totalStakedInSystem, - allCores + allDaos } = props; const api = useApi(); const scrollPositionRef = useRef(0); @@ -90,17 +90,17 @@ const ProjectCard = (props: ProjectCardProps) => { // }, [api]); const loadStakeRewardMinimum = useCallback(() => { - const minStakeReward = api.consts.ocifStaking.stakeThresholdForActiveCore.toPrimitive() as string; + const minStakeReward = api.consts.ocifStaking.stakeThresholdForActiveDao.toPrimitive() as string; setMinStakeReward(new BigNumber(minStakeReward)); }, [api]); const calcMinSupportMet = useCallback(() => { - if (minStakeReward.isLessThan(coreInfo?.totalStaked || new BigNumber(0))) { + if (minStakeReward.isLessThan(daoInfo?.totalStaked || new BigNumber(0))) { setMinSupportMet(true); } else { setMinSupportMet(false); } - }, [minStakeReward, coreInfo]); + }, [minStakeReward, daoInfo]); const handleClick = (event: React.MouseEvent) => { event.stopPropagation(); @@ -113,9 +113,9 @@ const ProjectCard = (props: ProjectCardProps) => { } handleManageStaking({ - core, + dao: core, totalUserStaked: parsedTotalStaked, - allCores + allDaos }); }; @@ -146,7 +146,7 @@ const ProjectCard = (props: ProjectCardProps) => { const batch = []; for (let era = min; era <= max; era++) { - batch.push(api.tx.ocifStaking.coreClaimRewards(core.key, era)); + batch.push(api.tx.ocifStaking.daoClaimRewards(core.key, era)); } try { @@ -193,15 +193,15 @@ const ProjectCard = (props: ProjectCardProps) => { toast.error("Error claiming DAO rewards."); console.error(error); } -}; + }; -const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: React.MouseEvent | React.TouchEvent) => { + const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: React.MouseEvent | React.TouchEvent) => { e.stopPropagation(); e.preventDefault(); if (mini) return; - const elements = document.querySelectorAll(`.${ statClass }`); + const elements = document.querySelectorAll(`.${statClass}`); elements.forEach(element => { const htmlElement = element as HTMLElement; if (isHovering) { @@ -222,7 +222,7 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: useEffect(() => { calcMinSupportMet(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [minStakeReward, coreInfo?.totalStaked]); + }, [minStakeReward, daoInfo?.totalStaked]); useEffect(() => { if (totalStaked !== undefined) { @@ -234,7 +234,7 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: {/* Total Stakers */} {!mini ?
handleStatsHover(true, 'stats-1', e)} onMouseLeave={(e) => handleStatsHover(false, 'stats-1', e)} onTouchStart={(e) => handleStatsHover(true, 'stats-1', e)} @@ -249,8 +249,8 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
- {(coreInfo?.numberOfStakers || 0) >= - (chainProperties?.maxStakersPerCore || 0) ? ( + {(daoInfo?.numberOfStakers || 0) >= + (chainProperties?.maxStakersPerDao || 0) ? ( { @@ -260,13 +260,13 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: }} /> ) : null} - {coreInfo?.numberOfStakers} + {daoInfo?.numberOfStakers}
: null} {/* Total Staked */} {!mini ?
handleStatsHover(true, 'stats-2', e)} onMouseLeave={(e) => handleStatsHover(false, 'stats-2', e)} onTouchStart={(e) => handleStatsHover(true, 'stats-2', e)} @@ -281,15 +281,15 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
- {coreInfo?.totalStaked - ? `${ formatNumberShorthand(parseFloat(coreInfo?.totalStaked.toString()) / Math.pow(10, 12)) } TNKR` + {daoInfo?.totalStaked + ? `${formatNumberShorthand(parseFloat(daoInfo?.totalStaked.toString()) / Math.pow(10, 12))} TNKR` : '--'}
: null} {/* My Stake */}
handleStatsHover(true, 'stats-3', e)} onMouseLeave={(e) => handleStatsHover(false, 'stats-3', e)} onTouchStart={(e) => handleStatsHover(true, 'stats-3', e)} @@ -305,14 +305,14 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
{totalUserStaked - ? `${ formatNumberShorthand(parseFloat(totalUserStaked.toString()) / Math.pow(10, 12)) } TNKR` + ? `${formatNumberShorthand(parseFloat(totalUserStaked.toString()) / Math.pow(10, 12))} TNKR` : '--'}
{/* Total Rewards */} {!mini ?
handleStatsHover(true, 'stats-4', e)} onMouseLeave={(e) => handleStatsHover(false, 'stats-4', e)} onTouchStart={(e) => handleStatsHover(true, 'stats-4', e)} @@ -328,14 +328,14 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
{coreRewards?.totalRewards - ? `${ formatNumberShorthand(parseFloat(coreRewards?.totalRewards.toString()) / Math.pow(10, 12)) } TNKR` + ? `${formatNumberShorthand(parseFloat(coreRewards?.totalRewards.toString()) / Math.pow(10, 12))} TNKR` : '--'}
: null} {/* Unclaimed Rewards */} {!mini ?
handleStatsHover(true, 'stats-5', e)} onMouseLeave={(e) => handleStatsHover(false, 'stats-5', e)} onTouchStart={(e) => handleStatsHover(true, 'stats-5', e)} @@ -351,14 +351,14 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
{coreRewards?.totalUnclaimed - ? `${ formatNumberShorthand(parseFloat(coreRewards?.totalUnclaimed.toString()) / Math.pow(10, 12)) } TNKR` + ? `${formatNumberShorthand(parseFloat(coreRewards?.totalUnclaimed.toString()) / Math.pow(10, 12))} TNKR` : '--'}
: null} {/* Support Share */} {!mini ?
handleStatsHover(true, 'stats-6', e)} onMouseLeave={(e) => handleStatsHover(false, 'stats-6', e)} onTouchStart={(e) => handleStatsHover(true, 'stats-6', e)} @@ -373,8 +373,8 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
- {coreInfo?.totalStaked && new BigNumber(totalStakedInSystem).isGreaterThan(new BigNumber(0)) - ? `${ new BigNumber(coreInfo?.totalStaked).times(100).div(new BigNumber(totalStakedInSystem)).toFixed(2) }%` + {daoInfo?.totalStaked && new BigNumber(totalStakedInSystem).isGreaterThan(new BigNumber(0)) + ? `${new BigNumber(daoInfo?.totalStaked).times(100).div(new BigNumber(totalStakedInSystem)).toFixed(2)}%` : '0%'}
: null} @@ -396,9 +396,9 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
- - {coreInfo?.totalStaked && minStakeReward - ? `${ minSupportMet ? '25K' : formatNumberShorthand(parseFloat(coreInfo?.totalStaked.toString()) / Math.pow(10, 12)) }/${ formatNumberShorthand(parseFloat(minStakeReward.toString()) / Math.pow(10, 12)) }` + + {daoInfo?.totalStaked && minStakeReward + ? `${minSupportMet ? '25K' : formatNumberShorthand(parseFloat(daoInfo?.totalStaked.toString()) / Math.pow(10, 12))}/${formatNumberShorthand(parseFloat(minStakeReward.toString()) / Math.pow(10, 12))}` : '--'} TNKR
@@ -408,7 +408,7 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: return (
+ className={`flex flex-col justify-between w-full rounded-xl space-y-4 border border-[1px] border-neutral-700 ${BG_GRADIENT}`}>
{/* Avatar, Name, Members */} @@ -427,7 +427,7 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e: onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onClick={handleReadMore}> -
+
Show More

@@ -436,7 +436,7 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:

: null}
{ // Update the stored scroll position scrollPositionRef.current = (e.target as HTMLElement).scrollTop; @@ -454,19 +454,19 @@ const handleStatsHover = useCallback((isHovering: boolean, statClass: string, e:
{selectedAccount ? - : null + : null } {(!mini && members.includes(selectedAccount?.address)) ? : null + >Claim DAO Rewards : null }
diff --git a/src/modals/ManageStaking.tsx b/src/modals/ManageStaking.tsx index 80b354e..ca22836 100644 --- a/src/modals/ManageStaking.tsx +++ b/src/modals/ManageStaking.tsx @@ -15,7 +15,7 @@ import useModal, { Metadata, ModalState, modalName } from "../stores/modals"; import classNames from "../utils/classNames"; import Input from "../components/Input"; import Button from "../components/Button"; -import { StakingCore, TotalUserStakedData } from "../routes/staking"; +import { StakingDao, TotalUserStakedData } from "../routes/staking"; import Dropdown from "../components/Dropdown"; import { BG_GRADIENT } from "../utils/consts"; import { formatBalanceSafely } from "../utils/formatBalanceSafely"; @@ -23,19 +23,19 @@ import { useBalance } from "../providers/balance"; interface TotaluserStakedDataRecord extends Record { } -export interface SelectedCoreInfo extends Metadata { +export interface SelectedDaoInfo extends Metadata { id: number; userStaked: BigNumber | undefined; name: string; availableBalance: string | undefined; totalUserStakedData: TotaluserStakedDataRecord; - allCores: StakingCore[]; + allDaos: StakingDao[]; } export interface StakingMetadata { - core: StakingCore; + dao: StakingDao; totalUserStaked: BigNumber; - allCores: StakingCore[]; + allDaos: StakingDao[]; }; const MIN_STAKE_AMOUNT = 10; @@ -56,7 +56,7 @@ const schema = z.object({ const ManageStaking = (props: { isOpen: boolean; }) => { const { isOpen } = props; const { availableBalance, reloadAccountInfo } = useBalance(); - const [selectedCore, setSelectedCore] = useState(null); + const [selectedCore, setSelectedCore] = useState(null); const [totalUserStakedData, setTotalUserStakedData] = useState({}); const [altBalance, setAltBalance] = useState(false); const [coreStakedBalance, setCoreStakedBalance] = useState("0"); @@ -67,7 +67,7 @@ const ManageStaking = (props: { isOpen: boolean; }) => { const targetModal = openModals.find(modal => modal.name === modalName.MANAGE_STAKING); const metadata = targetModal ? targetModal.metadata : undefined; const initialSelectedCore = useRef(metadata); - const allTheCores = useRef([]); + const allTheCores = useRef([]); const selectedAccount = useAccount((state) => state.selectedAccount); const stakeForm = useForm>({ resolver: zodResolver(schema), @@ -86,9 +86,9 @@ const ManageStaking = (props: { isOpen: boolean; }) => { return new BigNumber(cleanedValue); }, [coreStakedBalance]); - const selectedCoreInfo = useMemo(() => { + const selectedDaoInfo = useMemo(() => { return selectedCore - ? { id: selectedCore.key, userStaked: totalUserStakedData[selectedCore.key], name: selectedCore.metadata.name } as SelectedCoreInfo + ? { id: selectedCore.key, userStaked: totalUserStakedData[selectedCore.key], name: selectedCore.metadata.name } as SelectedDaoInfo : null; }, [selectedCore, totalUserStakedData]); @@ -170,15 +170,15 @@ const ManageStaking = (props: { isOpen: boolean; }) => { const isCoreSelected = initialSelectedCore.current && initialSelectedCore.current.key; if (isMetadataValid && isCoreSelected) { - const coreId = initialSelectedCore.current?.key as number; + const daoId = initialSelectedCore.current?.key as number; const totalUserStakedData = metadata.totalUserStakedData as TotaluserStakedDataRecord; - const userStakedAmount = new BigNumber(totalUserStakedData[coreId]); + const userStakedAmount = new BigNumber(totalUserStakedData[daoId]); const zeroStake = userStakedAmount.isZero(); const minValueNotMet = parsedAmount.isLessThan(minValue); const isInitialStakeTooLow = zeroStake && minValueNotMet; if (isInitialStakeTooLow) { - const errorMessage = `Initial staking amount must be greater than or equal to ${ minValue.toString() }`; + const errorMessage = `Initial staking amount must be greater than or equal to ${minValue.toString()}`; stakeForm.setError("amount", { type: "min", message: errorMessage }); return; } @@ -187,7 +187,7 @@ const ManageStaking = (props: { isOpen: boolean; }) => { if (parsedAmount.isGreaterThan(maxValue)) { stakeForm.setError("amount", { type: "max", - message: `Amount must be less than or equal to ${ altBalance ? "staked" : "available" } balance`, + message: `Amount must be less than or equal to ${altBalance ? "staked" : "available"} balance`, }); return; } @@ -202,23 +202,23 @@ const ManageStaking = (props: { isOpen: boolean; }) => { try { if (!altBalance) { - const fromCore = metadata.key; + const fromDao = metadata.key; const amount = parsedStakeAmount.toString(); await api.tx.ocifStaking - .stake(fromCore, amount) + .stake(fromDao, amount) .signAndSend( selectedAccount.address, { signer: injector.signer }, getSignAndSendCallbackWithPromise(toasts, api) ); } else { - const toCore = metadata.key; - const fromCore = selectedCoreInfo?.id; + const toDao = metadata.key; + const fromDao = selectedDaoInfo?.id; const amount = parsedStakeAmount.toString(); await api.tx.ocifStaking - .moveStake(fromCore, amount, toCore) + .moveStake(fromDao, amount, toDao) .signAndSend( selectedAccount.address, { signer: injector.signer }, @@ -227,7 +227,7 @@ const ManageStaking = (props: { isOpen: boolean; }) => { } } catch (error) { toast.dismiss(); - toast.error(`${ error }`); + toast.error(`${error}`); } finally { closeCurrentModal(); } @@ -370,8 +370,8 @@ const ManageStaking = (props: { isOpen: boolean; }) => { return; } - if ('allCores' in metadata) { - allTheCores.current = metadata.allCores as StakingCore[]; + if ('allDaos' in metadata) { + allTheCores.current = metadata.allDaos as StakingDao[]; } if ('totalUserStakedData' in metadata) { @@ -400,12 +400,12 @@ const ManageStaking = (props: { isOpen: boolean; }) => { setCoreStakedBalance(balance); } else { setAltBalance(true); - if (selectedCoreInfo?.userStaked) { - const stakedBalance = formatBalanceSafely(selectedCoreInfo?.userStaked?.toString()); + if (selectedDaoInfo?.userStaked) { + const stakedBalance = formatBalanceSafely(selectedDaoInfo?.userStaked?.toString()); setCoreStakedBalance(stakedBalance); } } - }, [selectedCoreInfo, selectedCore, availableBalance]); + }, [selectedDaoInfo, selectedCore, availableBalance]); useEffect(() => { let balanceBN; @@ -444,14 +444,14 @@ const ManageStaking = (props: { isOpen: boolean; }) => { useEffect(() => { stakeForm.clearErrors(); unstakeForm.clearErrors(); - }, [selectedCoreInfo, stakeForm, unstakeForm]); + }, [selectedDaoInfo, stakeForm, unstakeForm]); const RestakingDropdown = memo(() => { const list = allTheCores.current - .map(core => ({ id: core.key, userStaked: totalUserStakedData[core.key], name: core.metadata.name }) as SelectedCoreInfo) + .map(core => ({ id: core.key, userStaked: totalUserStakedData[core.key], name: core.metadata.name }) as SelectedDaoInfo) .filter(core => core.userStaked && core.userStaked.gt(0)); - return ; + return ; }); return isOpen ? ( @@ -464,7 +464,7 @@ const ManageStaking = (props: { isOpen: boolean; }) => { <> -
+

Manage Staking for {(initialSelectedCore.current?.metadata as { name: string; })?.name}

diff --git a/src/modals/RegisterProject.tsx b/src/modals/RegisterProject.tsx index e92557f..36a0f48 100644 --- a/src/modals/RegisterProject.tsx +++ b/src/modals/RegisterProject.tsx @@ -16,7 +16,7 @@ import { getSignAndSendCallbackWithPromise } from "../utils/getSignAndSendCallba const schema = z .object({ - core: z.string(), + dao: z.string(), name: z.string().max(20), description: z.string().max(300), image: z.string().url().max(100), @@ -46,7 +46,7 @@ const RegisterProject = ({ isOpen }: { isOpen: boolean; }) => { }; const handleRegister = registerProjectForm.handleSubmit( - async ({ core, name, description, image }) => { + async ({ dao: core, name, description, image }) => { if (!selectedAccount) return; if (!api) return; @@ -87,7 +87,7 @@ const RegisterProject = ({ isOpen }: { isOpen: boolean; }) => { const injector = await web3FromAddress(selectedAccount.address); - const calls = [api.tx.ocifStaking.registerCore(name, description, image)]; + const calls = [api.tx.ocifStaking.registerDao(name, description, image)]; try { await api.tx.inv4 @@ -128,7 +128,7 @@ const RegisterProject = ({ isOpen }: { isOpen: boolean; }) => { } catch (error) { toast.dismiss(); - toast.error(`${ error }`); + toast.error(`${error}`); } } ); @@ -165,7 +165,7 @@ const RegisterProject = ({ isOpen }: { isOpen: boolean; }) => { <> -
+
{/*
diff --git a/src/routes/claim.tsx b/src/routes/claim.tsx index c5b8486..0340a3a 100644 --- a/src/routes/claim.tsx +++ b/src/routes/claim.tsx @@ -12,7 +12,7 @@ import LoadingSpinner from "../components/LoadingSpinner"; import useApi from "../hooks/useApi"; import Button from "../components/Button"; import { calculateVestingSchedule, calculateVestingData, fetchSystemData } from "../utils/vestingServices"; -import { loadProjectCores } from "../utils/stakingServices"; +import { loadProjectDaos } from "../utils/stakingServices"; import { getSignAndSendCallbackWithPromise } from "../utils/getSignAndSendCallback"; import { CoreEraType } from "./staking"; @@ -97,13 +97,13 @@ const Claim = () => { const loadStakedTNKR = useCallback(async (selectedAccount: InjectedAccountWithMeta | null) => { try { const currentEra = (await api.query.ocifStaking.currentEra()).toPrimitive() as number; - const stakingCores = await loadProjectCores(api); + const stakingDaos = await loadProjectDaos(api); - if (selectedAccount && stakingCores) { - const userStakeInfo: { coreId: number; era: number; staked: BigNumber; }[] = []; - let unclaimedCores = { cores: [] as CoreEraType[], total: 0 }; + if (selectedAccount && stakingDaos) { + const userStakeInfo: { daoId: number; era: number; staked: BigNumber; }[] = []; + let unclaimedCores = { daos: [] as CoreEraType[], total: 0 }; - for (const core of stakingCores) { + for (const core of stakingDaos) { const stakerInfo = await api.query.ocifStaking.generalStakerInfo(core.key, selectedAccount.address); const info = stakerInfo.toPrimitive() as StakesInfo; @@ -111,19 +111,19 @@ const Claim = () => { const earliestUnclaimedEra = parseInt(info.stakes[0].era); if (earliestUnclaimedEra < currentEra) { - const updatedCores = unclaimedCores.cores.filter((value) => value.coreId !== core.key); - updatedCores.push({ coreId: core.key, earliestEra: earliestUnclaimedEra }); + const updatedCores = unclaimedCores.daos.filter((value) => value.daoId !== core.key); + updatedCores.push({ daoId: core.key, earliestEra: earliestUnclaimedEra }); const total = Math.max(unclaimedCores.total, currentEra - earliestUnclaimedEra); - unclaimedCores = { cores: updatedCores, total }; + unclaimedCores = { daos: updatedCores, total }; } const latestStake = info.stakes.at(-1); if (latestStake) { userStakeInfo.push({ - coreId: core.key, + daoId: core.key, era: parseInt(latestStake.era), staked: new BigNumber(latestStake.staked), }); @@ -138,7 +138,7 @@ const Claim = () => { setTotalStakedTNKR(formattedStaked.toString()); } } catch (error) { - toast.error(`${ error }`); + toast.error(`${error}`); } }, [api]); @@ -224,7 +224,7 @@ const Claim = () => { toast.dismiss(); } catch (error) { toast.dismiss(); - toast.error(`${ error }`); + toast.error(`${error}`); console.error(error); } }; diff --git a/src/routes/overview.tsx b/src/routes/overview.tsx index 8ec115a..b9765fe 100644 --- a/src/routes/overview.tsx +++ b/src/routes/overview.tsx @@ -10,22 +10,22 @@ import { useQuery } from "urql"; import { AnyJson, Codec } from "@polkadot/types/types"; import { StakesInfo, VestingData, VestingSchedule } from "./claim"; import MetricDashboard from "../components/MetricDashboard"; -import { loadProjectCores } from '../utils/stakingServices'; -import { StakingCore, CoreEraStakeInfoType, UserStakedInfoType, BalanceType, LockedType, TotalRewardsClaimedQuery, TotalRewardsCoreClaimedQuery, UnclaimedErasType, StakedType } from "./staking"; +import { loadProjectDaos } from '../utils/stakingServices'; +import { StakingDao, DaoEraStakeInfoType, UserStakedInfoType, BalanceType, LockedType, TotalRewardsClaimedQuery, TotalRewardsDaoClaimedQuery, UnclaimedErasType, StakedType } from "./staking"; import { calculateVestingData, fetchSystemData } from "../utils/vestingServices"; import DaoList from "../components/DaoList"; -export type StakedDaoType = StakingCore & { members?: AnyJson; }; +export type StakedDaoType = StakingDao & { members?: AnyJson; }; const Overview = () => { const api = useApi(); const selectedAccount = useAccount((state) => state.selectedAccount); - const [stakingCores, setStakingCores] = useState([]); + const [stakingDaos, setStakingDaos] = useState([]); const [currentStakingEra, setCurrentStakingEra] = useState(0); - const [coreEraStakeInfo, setCoreEraStakeInfo] = useState([]); + const [daoEraStakeInfo, setDaoEraStakeInfo] = useState([]); const [totalUserStaked, setTotalUserStaked] = useState(); const [aggregateStaked, setAggregateStaked] = useState(); - const [unclaimedEras, setUnclaimedEras] = useState({ cores: [], total: 0 }); + const [unclaimedEras, setUnclaimedEras] = useState({ daos: [], total: 0 }); const [availableBalance, setAvailableBalance] = useState(); const [lockedBalance, setLockedBalance] = useState(); const [isLoading, setLoading] = useState(true); @@ -47,7 +47,7 @@ const Overview = () => { }); const [rewardsCoreClaimedQuery] = useQuery({ - query: TotalRewardsCoreClaimedQuery, + query: TotalRewardsDaoClaimedQuery, variables: {}, pause: !selectedAccount, @@ -62,10 +62,10 @@ const Overview = () => { number, UserStakedInfoType > = new Map(); - if (coreEraStakeInfo && coreEraStakeInfo.length > 0) { - for (const stakingCore of stakingCores) { + if (daoEraStakeInfo && daoEraStakeInfo.length > 0) { + for (const stakingDao of stakingDaos) { await api.query.ocifStaking.generalStakerInfo( - stakingCore.key, + stakingDao.key, selectedAccount.address, (generalStakerInfo: Codec) => { const info = generalStakerInfo.toPrimitive() as StakesInfo; @@ -79,13 +79,13 @@ const Overview = () => { if (parseInt(unclaimedEarliest) < currentStakingEra) { const unclaimed = unclaimedEras; - const unclaimedCore = unclaimed.cores.find(value => value.coreId === stakingCore.key); + const unclaimedCore = unclaimed.daos.find(value => value.daoId === stakingDao.key); if (unclaimedCore) { unclaimedCore.earliestEra = parseInt(unclaimedEarliest); } else { - unclaimed.cores.push({ - coreId: stakingCore.key, + unclaimed.daos.push({ + daoId: stakingDao.key, earliestEra: parseInt(unclaimedEarliest), }); } @@ -94,7 +94,7 @@ const Overview = () => { total = currentStakingEra - parseInt(unclaimedEarliest); setUnclaimedEras({ - cores: unclaimed.cores, + daos: unclaimed.daos, total, }); } else { @@ -110,8 +110,8 @@ const Overview = () => { staked = new BigNumber(latestInfo.staked); } - userStakedInfoMap.set(stakingCore.key, { - coreId: stakingCore.key, + userStakedInfoMap.set(stakingDao.key, { + daoId: stakingDao.key, era: era, staked: staked, }); @@ -124,7 +124,7 @@ const Overview = () => { ); } } - }, [api, currentStakingEra, stakingCores, unclaimedEras, selectedAccount, coreEraStakeInfo]); + }, [api, currentStakingEra, stakingDaos, unclaimedEras, selectedAccount, daoEraStakeInfo]); const loadAggregateStaked = useCallback(async () => { const totalIssuance = (await api.query.balances.totalIssuance()).toPrimitive() as string; @@ -133,10 +133,10 @@ const Overview = () => { }, [api]); const loadCores = useCallback(async () => { - const cores = await loadProjectCores(api); + const daos = await loadProjectDaos(api); - if (cores) { - setStakingCores(cores); + if (daos) { + setStakingDaos(daos); } }, [api]); @@ -178,7 +178,7 @@ const Overview = () => { const initializeData = useCallback(async (selectedAccount: InjectedAccountWithMeta | null) => { try { - toast.loading("Loading staking cores..."); + toast.loading("Loading staking daos..."); if (selectedAccount) { await Promise.all([ @@ -191,7 +191,7 @@ const Overview = () => { } } catch (error) { toast.dismiss(); - toast.error(`${ error }`); + toast.error(`${error}`); } finally { toast.dismiss(); toast.success("Loaded"); @@ -208,7 +208,7 @@ const Overview = () => { }; setup(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedAccount, stakingCores, coreEraStakeInfo]); + }, [selectedAccount, stakingDaos, daoEraStakeInfo]); useEffect(() => { initializeData(selectedAccount); @@ -236,16 +236,16 @@ const Overview = () => { }, [selectedAccount, rewardsUserClaimedQuery.fetching, rewardsUserClaimedQuery.data]); useEffect(() => { - if (rewardsCoreClaimedQuery.fetching || !rewardsCoreClaimedQuery.data?.cores?.length || !selectedAccount?.address) return; + if (rewardsCoreClaimedQuery.fetching || !rewardsCoreClaimedQuery.data?.daos?.length || !selectedAccount?.address) return; - const coreEraStakeInfoMap: CoreEraStakeInfoType[] = rewardsCoreClaimedQuery.data.cores; + const daoEraStakeInfoMap: DaoEraStakeInfoType[] = rewardsCoreClaimedQuery.data.daos; - const uniqueCoreEraStakeInfo = coreEraStakeInfoMap.filter((core, index, self) => - index === self.findIndex((item) => item.coreId === core.coreId) + const uniqueCoreEraStakeInfo = daoEraStakeInfoMap.filter((core, index, self) => + index === self.findIndex((item) => item.daoId === core.daoId) ); - setCoreEraStakeInfo(uniqueCoreEraStakeInfo); - }, [selectedAccount, stakingCores, rewardsCoreClaimedQuery.data, rewardsCoreClaimedQuery.fetching]); + setDaoEraStakeInfo(uniqueCoreEraStakeInfo); + }, [selectedAccount, stakingDaos, rewardsCoreClaimedQuery.data, rewardsCoreClaimedQuery.fetching]); return (
diff --git a/src/routes/staking.tsx b/src/routes/staking.tsx index 90681ba..ffc6793 100644 --- a/src/routes/staking.tsx +++ b/src/routes/staking.tsx @@ -8,7 +8,7 @@ import useAccount from "../stores/account"; import { Codec } from "@polkadot/types/types"; import { StakesInfo } from "./claim"; import MetricDashboard from "../components/MetricDashboard"; -import { loadProjectCores } from '../utils/stakingServices'; +import { loadProjectDaos } from '../utils/stakingServices'; import DaoList from "../components/DaoList"; import Button from "../components/Button"; import useModal, { modalName } from "../stores/modals"; @@ -44,29 +44,29 @@ export const TotalRewardsClaimedSubscription = ` } `; -export const TotalRewardsCoreClaimedQuery = ` - query totalRewardsCoreClaimed($coreId: Int) { - cores(where: {coreId_eq: $coreId}) { +export const TotalRewardsDaoClaimedQuery = ` + query totalRewardsCoreClaimed($daoId: Int) { + daos(where: {daoId_eq: $daoId}) { latestClaimBlock totalRewards totalUnclaimed - coreId + daoId } } `; export const TotalRewardsCoreClaimedSubscription = ` - subscription totalRewardsCoreClaimed($coreId: Int) { - cores(where: {coreId_eq: $coreId}) { + subscription totalRewardsCoreClaimed($daoId: Int) { + daos(where: {daoId_eq: $daoId}) { latestClaimBlock totalRewards totalUnclaimed - coreId + daoId } } `; -export type StakingCore = { +export type StakingDao = { key: number; account: string; metadata: { @@ -90,35 +90,35 @@ export type BalanceType = { }; }; -export type CoreEraStakeInfoType = { - coreId: number; +export type DaoEraStakeInfoType = { + daoId: number; totalStaked: string; numberOfStakers: number; rewardClaimed: boolean; active: boolean; }; -export type CoreIndexedRewardsType = { - coreId: number; +export type DaoIndexedRewardsType = { + daoId: number; totalRewards: string; totalUnclaimed: string; }; -export type CoreEraType = { coreId: number; earliestEra: number; }; +export type CoreEraType = { daoId: number; earliestEra: number; }; export type UnclaimedErasType = { - cores: CoreEraType[]; + daos: CoreEraType[]; total: number; }; export type UserStakedInfoType = { - coreId: number; + daoId: number; era: number; staked: BigNumber; }; export type ChainPropertiesType = { - maxStakersPerCore: number; + maxStakersPerDao: number; inflationErasPerYear: number; }; @@ -136,7 +136,7 @@ export type LockedType = { locked: string; }; export type StakedType = { staked: string; }; -export type CorePrimitiveType = { +export type DaoPrimitiveType = { account: string; metadata: { name: string; @@ -145,15 +145,15 @@ export type CorePrimitiveType = { }; }; -export function getTotalUserStaked(userStakedInfo: UserStakedInfoType[], core: StakingCore) { +export function getTotalUserStaked(userStakedInfo: UserStakedInfoType[], dao: StakingDao) { return !!userStakedInfo && userStakedInfo.find( - (info) => info.coreId === core.key + (info) => info.daoId === dao.key )?.staked; } -export function getCoreInfo(coreEraStakeInfo: (CoreEraStakeInfoType)[], core: StakingCore) { - return !!coreEraStakeInfo && coreEraStakeInfo.find( - (info) => info.coreId === core.key +export function getDaoInfo(daoEraStakeInfo: (DaoEraStakeInfoType)[], dao: StakingDao) { + return !!daoEraStakeInfo && daoEraStakeInfo.find( + (info) => info.daoId === dao.key ); } @@ -168,7 +168,7 @@ const Staking = () => { const [isDataLoaded, setDataLoaded] = useState(false); const [enableAutoRestake, setEnableAutoRestake] = useState(false); const [claimAllSuccess, setClaimAllSuccess] = useState(false); - const [stakingCores, setStakingCores] = useState([]); + const [stakingDaos, setStakingDaos] = useState([]); const [currentStakingEra, setCurrentStakingEra] = useState(0); const [totalUserStaked, setTotalUserStaked] = useState(); const [totalStaked, setTotalStaked] = useState(); @@ -176,8 +176,8 @@ const Staking = () => { const [aggregateStaked, setAggregateStaked] = useState(); const [totalUnclaimed, setTotalUnclaimed] = useState(new BigNumber(0)); const [totalClaimed, setTotalClaimed] = useState(new BigNumber(0)); - const [coreEraStakeInfo, setCoreEraStakeInfo] = useState([]); - const [unclaimedEras, setUnclaimedEras] = useState({ cores: [], total: 0 }); + const [daoEraStakeInfo, setDaoEraStakeInfo] = useState([]); + const [unclaimedEras, setUnclaimedEras] = useState({ daos: [], total: 0 }); const [currentBlock, setCurrentBlock] = useState(0); const [nextEraBlock, setNextEraBlock] = useState(0); const [blocksPerEra, setBlocksPerEra] = useState(0); @@ -203,10 +203,10 @@ const Staking = () => { throw new Error("selectedAccount is null"); }; - if (coreEraStakeInfo && coreEraStakeInfo.length > 0) { - const promises = stakingCores.map((stakingCore) => + if (daoEraStakeInfo && daoEraStakeInfo.length > 0) { + const promises = stakingDaos.map((stakingDao) => api.query.ocifStaking.generalStakerInfo( - stakingCore.key, + stakingDao.key, selectedAccount.address, async (generalStakerInfo: Codec) => { const info = generalStakerInfo.toPrimitive() as StakesInfo; @@ -220,13 +220,13 @@ const Staking = () => { if (parseInt(unclaimedEarliest) <= currentStakingEra) { setUnclaimedEras(prevState => { - const unclaimedCore = prevState.cores.find(value => value.coreId === stakingCore.key); + const unclaimedCore = prevState.daos.find(value => value.daoId === stakingDao.key); if (unclaimedCore) { unclaimedCore.earliestEra = parseInt(unclaimedEarliest); } else { - prevState.cores.push({ - coreId: stakingCore.key, + prevState.daos.push({ + daoId: stakingDao.key, earliestEra: parseInt(unclaimedEarliest), }); } @@ -235,7 +235,7 @@ const Staking = () => { total = currentStakingEra - parseInt(unclaimedEarliest); return { - cores: prevState.cores, + daos: prevState.daos, total, }; }); @@ -257,8 +257,8 @@ const Staking = () => { const updatedMap = new Map(currentMap); // Update the cloned map with new data - updatedMap.set(stakingCore.key, { - coreId: stakingCore.key, + updatedMap.set(stakingDao.key, { + daoId: stakingDao.key, era: era, staked: staked, }); @@ -279,7 +279,7 @@ const Staking = () => { await Promise.all(promises); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [api, stakingCores, selectedAccount, coreEraStakeInfo, currentStakingEra]); + }, [api, stakingDaos, selectedAccount, daoEraStakeInfo, currentStakingEra]); const loadCurrentEraAndStake = useCallback(async () => { const currentStakingEra = (await api.query.ocifStaking.currentEra()).toPrimitive() as number; @@ -327,18 +327,18 @@ const Staking = () => { }, [api]); const loadCores = useCallback(async () => { - const cores = await loadProjectCores(api); + const daos = await loadProjectDaos(api); - if (cores) { - setStakingCores(cores); + if (daos) { + setStakingDaos(daos); - const coreEraStakeInfoMap: Map< - number, CoreEraStakeInfoType> = new Map(); + const daoEraStakeInfoMap: Map< + number, DaoEraStakeInfoType> = new Map(); const currentEra = await api.query.ocifStaking.currentEra(); - for (const stakingCore of cores) { - const inf = await api.query.ocifStaking.coreEraStake(stakingCore.key, currentEra); + for (const stakingDao of daos) { + const inf = await api.query.ocifStaking.coreEraStake(stakingDao.key, currentEra); const info: { total: string; @@ -352,23 +352,23 @@ const Staking = () => { active: boolean; }; - coreEraStakeInfoMap.set(stakingCore.key, { + daoEraStakeInfoMap.set(stakingDao.key, { totalStaked: info.total, active: info.active, rewardClaimed: info.rewardClaimed, numberOfStakers: info.numberOfStakers, - coreId: stakingCore.key + daoId: stakingDao.key }); - const coreEraStake = Array.from(coreEraStakeInfoMap.values()); - setCoreEraStakeInfo(coreEraStake); + const coreEraStake = Array.from(daoEraStakeInfoMap.values()); + setDaoEraStakeInfo(coreEraStake); } } }, [api]); const initializeData = useCallback(async (selectedAccount: InjectedAccountWithMeta | null) => { try { - toast.loading("Loading staking cores..."); + toast.loading("Loading staking daos..."); if (selectedAccount) { await Promise.all([ @@ -381,7 +381,7 @@ const Staking = () => { } } catch (error) { toast.dismiss(); - toast.error(`${ error }`); + toast.error(`${error}`); } finally { toast.dismiss(); toast.success('Loaded'); @@ -469,7 +469,7 @@ const Staking = () => { } setTotalUnclaimed(new BigNumber(0)); - setUnclaimedEras({ cores: [], total: 0 }); + setUnclaimedEras({ daos: [], total: 0 }); setClaimAllSuccess(true); refreshQuery(); reloadAccountInfo(); diff --git a/src/stores/rpc.tsx b/src/stores/rpc.tsx index 5410bcc..626ab9e 100644 --- a/src/stores/rpc.tsx +++ b/src/stores/rpc.tsx @@ -42,7 +42,7 @@ const useRPC = createWithEqualityFn()((set, get) => ({ console.error(error); - throw new Error(`Failed to connect to ${ host }`); + throw new Error(`Failed to connect to ${host}`); } }, })); diff --git a/src/utils/restakeClaim.ts b/src/utils/restakeClaim.ts index 7b7aadf..c691a44 100644 --- a/src/utils/restakeClaim.ts +++ b/src/utils/restakeClaim.ts @@ -47,12 +47,12 @@ export const restakeClaim = async ({ await web3Enable("Tinkernet"); const injector = await web3FromAddress(selectedAccount.address); - const uniqueCores = [...new Map(unclaimedEras.cores.map((x) => [x['coreId'], x])).values()]; + const uniqueCores = [...new Map(unclaimedEras.daos.map((x) => [x['daoId'], x])).values()]; const batch: unknown[] = []; // Filter uniqueCores to include only those with non-zero stake const coresWithStake = uniqueCores.filter(core => { - const userStakeInfo = userStakedInfoMap.get(core.coreId); + const userStakeInfo = userStakedInfoMap.get(core.daoId); const hasStake = userStakeInfo && userStakeInfo.staked.isGreaterThan(0); return hasStake; }); @@ -61,7 +61,7 @@ export const restakeClaim = async ({ uniqueCores.forEach(core => { if (!core?.earliestEra) return; for (let i = core.earliestEra; i < currentStakingEra; i++) { - batch.push(api.tx.ocifStaking.stakerClaimRewards(core.coreId)); + batch.push(api.tx.ocifStaking.stakerClaimRewards(core.daoId)); } }); @@ -80,7 +80,7 @@ export const restakeClaim = async ({ const restakeUnclaimedAmount = handleRestakingLogic(undefined, coresWithStake.length); if (restakeUnclaimedAmount && restakeUnclaimedAmount.isGreaterThan(0)) { const restakeAmountInteger = restakeUnclaimedAmount.integerValue().toString(); - batch.push(api.tx.ocifStaking.stake(core.coreId, restakeAmountInteger)); + batch.push(api.tx.ocifStaking.stake(core.daoId, restakeAmountInteger)); } }); } @@ -91,11 +91,11 @@ export const restakeClaim = async ({ const batchTxFees: Balance = info.partialFee; const rebuildBatch: unknown[] = []; - // Rebuild the batch with only the cores where the user has a non-zero stake + // Rebuild the batch with only the daos where the user has a non-zero stake uniqueCores.forEach(core => { if (!core?.earliestEra) return; for (let i = core.earliestEra; i < currentStakingEra; i++) { - rebuildBatch.push(api.tx.ocifStaking.stakerClaimRewards(core.coreId)); + rebuildBatch.push(api.tx.ocifStaking.stakerClaimRewards(core.daoId)); } }); @@ -109,12 +109,12 @@ export const restakeClaim = async ({ const adjustedRestakeAmount = restakeUnclaimedAmount.minus(new BigNumber(batchTxFees.toString())); if (adjustedRestakeAmount.isGreaterThan(0)) { // Check if there's a non-zero amount to stake const restakeAmountInteger = adjustedRestakeAmount.integerValue().toString(); - rebuildBatch.push(api.tx.ocifStaking.stake(core.coreId, restakeAmountInteger)); + rebuildBatch.push(api.tx.ocifStaking.stake(core.daoId, restakeAmountInteger)); } else { - console.log(`Skipping core ID: ${ core.coreId } due to zero adjusted restake amount.`); + console.log(`Skipping core ID: ${core.daoId} due to zero adjusted restake amount.`); } } else { - console.log(`Skipping core ID: ${ core.coreId } due to insufficient unclaimed rewards to cover transaction fees.`); + console.log(`Skipping core ID: ${core.daoId} due to insufficient unclaimed rewards to cover transaction fees.`); } }); } @@ -171,7 +171,7 @@ export const restakeClaim = async ({ ); } catch (error) { toast.dismiss(); - toast.error(`${ error }`); + toast.error(`${error}`); console.error(error); setWaiting(false); } diff --git a/src/utils/stakingServices.ts b/src/utils/stakingServices.ts index 0dad034..8c7e8c1 100644 --- a/src/utils/stakingServices.ts +++ b/src/utils/stakingServices.ts @@ -1,11 +1,11 @@ import { ApiPromise } from "@polkadot/api"; -import { CorePrimitiveType, StakingCore } from "../routes/staking"; +import { DaoPrimitiveType, StakingDao } from "../routes/staking"; import { StakedDaoType } from "../routes/overview"; -export const loadStakedDaos = async (stakingCores: StakingCore[], selectedAccount: string, api: ApiPromise) => { - if (!stakingCores || stakingCores.length === 0 || !selectedAccount) return []; +export const loadStakedDaos = async (stakingDaos: StakingDao[], selectedAccount: string, api: ApiPromise) => { + if (!stakingDaos || stakingDaos.length === 0 || !selectedAccount) return []; - const daos: StakedDaoType[] = await Promise.all(stakingCores.map(async (core) => { + const daos: StakedDaoType[] = await Promise.all(stakingDaos.map(async (core) => { const members = await api.query.inv4.coreMembers.entries(core.key); const mems = members.map(([key]) => key.args.map((arg) => arg.toHuman())[1]); return { ...core, members: mems }; @@ -14,11 +14,11 @@ export const loadStakedDaos = async (stakingCores: StakingCore[], selectedAccoun return daos; }; -export async function loadProjectCores( +export async function loadProjectDaos( api: ApiPromise, -): Promise | undefined> { +): Promise | undefined> { try { - const stakingCores = ( + const stakingDaos = ( await api.query.ocifStaking.registeredCore.entries() ).map( ([ @@ -27,7 +27,7 @@ export async function loadProjectCores( }, core, ]) => { - const c = core.toPrimitive() as CorePrimitiveType; + const c = core.toPrimitive() as DaoPrimitiveType; const primitiveKey = key.toPrimitive() as number; @@ -38,7 +38,7 @@ export async function loadProjectCores( } ); - return stakingCores; + return stakingDaos; } catch (error) { console.log(error); }