diff --git a/package.json b/package.json index d9f7381575..cf5fc369c9 100644 --- a/package.json +++ b/package.json @@ -112,8 +112,6 @@ "graphql": "^16.8.1", "he": "^1.2.0", "jsonwebtoken": "^9.0.0", - "juice-sdk-core": "2.1.1", - "juice-sdk-react": "5.0.2", "juicebox-metadata-helper": "0.1.7", "less": "4.1.2", "lodash": "^4.17.21", @@ -149,7 +147,9 @@ "viem": "^2.31.6", "wagmi": "^2.15.6", "yarn": "^1.22.22", - "yup": "^1.4.0" + "yup": "^1.4.0", + "@bananapus/nana-sdk-core": "1.0.0", + "@bananapus/nana-sdk-react": "1.0.0" }, "devDependencies": { "@babel/core": "^7.24.7", diff --git a/src/components/EthereumAddress.tsx b/src/components/EthereumAddress.tsx index 8b4ec5d076..ef9ee59189 100644 --- a/src/components/EthereumAddress.tsx +++ b/src/components/EthereumAddress.tsx @@ -2,7 +2,7 @@ import { Tooltip } from 'antd' import CopyTextButton from 'components/buttons/CopyTextButton' import EtherscanLink from 'components/EtherscanLink' import { useEnsName } from 'hooks/useEnsName' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import Link from 'next/link' import { MouseEventHandler, useMemo } from 'react' import { twMerge } from 'tailwind-merge' diff --git a/src/components/EtherscanLink.tsx b/src/components/EtherscanLink.tsx index d278a18ef3..4491d8ea4c 100644 --- a/src/components/EtherscanLink.tsx +++ b/src/components/EtherscanLink.tsx @@ -1,5 +1,5 @@ import { LinkIcon } from '@heroicons/react/24/outline' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { MouseEventHandler } from 'react' import { twMerge } from 'tailwind-merge' import { etherscanLink } from 'utils/etherscan' diff --git a/src/components/Home/HomepageProjectCard.tsx b/src/components/Home/HomepageProjectCard.tsx index e5a1dc39d6..defcee9188 100644 --- a/src/components/Home/HomepageProjectCard.tsx +++ b/src/components/Home/HomepageProjectCard.tsx @@ -3,13 +3,17 @@ import { Skeleton } from 'antd' import { HomepageCard } from 'components/Home/HomepageCard' import ProjectLogo from 'components/ProjectLogo' import ETHAmount from 'components/currency/ETHAmount' -import { PV_V2, PV_V4, PV_V5 } from 'constants/pv' +import { PV_V2, PV_V4, PV_V5, PV_V6 } from 'constants/pv' import { useProjectMetadata } from 'hooks/useProjectMetadata' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { SubgraphQueryProject } from 'models/subgraphProjects' import { v2v3ProjectRoute } from 'packages/v2v3/utils/routes' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' -import { v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { + v4ProjectRoute, + v5ProjectRoute, + v6ProjectRoute, +} from 'packages/v4v5/utils/routes' function Statistic({ name, @@ -55,7 +59,12 @@ export function HomepageProjectCard({ return ( { const router = useRouter() // Hide protocol activity toggle on project pages - const isProjectPage = router.pathname.startsWith('/v5/') || router.pathname.startsWith('/v4/') - const isProjectRoute = /^\/(v4|v5)\/[^\/]+/.test(router.asPath) + const isProjectPage = router.pathname.startsWith('/v6/') || router.pathname.startsWith('/v5/') || router.pathname.startsWith('/v4/') + const isProjectRoute = /^\/(v4|v5|v6)\/[^\/]+/.test(router.asPath) const showProtocolActivityToggle = !(isProjectPage && isProjectRoute) return ( @@ -103,8 +103,8 @@ const MobileSiteNavigation = () => { const router = useRouter() // Hide protocol activity toggle on project pages - const isProjectPage = router.pathname.startsWith('/v5/') || router.pathname.startsWith('/v4/') - const isProjectRoute = /^\/(v4|v5)\/[^\/]+/.test(router.asPath) + const isProjectPage = router.pathname.startsWith('/v6/') || router.pathname.startsWith('/v5/') || router.pathname.startsWith('/v4/') + const isProjectRoute = /^\/(v4|v5|v6)\/[^\/]+/.test(router.asPath) const showProtocolActivityToggle = !(isProjectPage && isProjectRoute) return ( diff --git a/src/components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationTable.tsx b/src/components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationTable.tsx index 8583a33ace..e2e0463309 100644 --- a/src/components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationTable.tsx +++ b/src/components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationTable.tsx @@ -1,6 +1,6 @@ import { MinusCircleIcon, PlusCircleIcon } from '@heroicons/react/24/outline' import { ReactNode, useMemo } from 'react' -import { useJBProjectId, useJBRuleset } from 'juice-sdk-react' +import { useJBProjectId, useJBRuleset } from '@bananapus/nana-sdk-react' import { ConfigurationPanelTableData } from './ConfigurationPanel' import CopyTextButton from 'components/buttons/CopyTextButton' diff --git a/src/components/ProjectCard.tsx b/src/components/ProjectCard.tsx index 2100b1076d..fb3714f847 100644 --- a/src/components/ProjectCard.tsx +++ b/src/components/ProjectCard.tsx @@ -1,7 +1,7 @@ import * as constants from '@ethersproject/constants' import { BookmarkIcon as BookmarkIconSolid } from '@heroicons/react/24/solid' import { Skeleton } from 'antd' -import { PV_V2, PV_V4, PV_V5 } from 'constants/pv' +import { PV_V2, PV_V4, PV_V5, PV_V6 } from 'constants/pv' import { useProjectHandleText } from 'hooks/useProjectHandleText' import { useProjectMetadata } from 'hooks/useProjectMetadata' import { useSubtitle } from 'hooks/useSubtitle' @@ -9,7 +9,11 @@ import { DBProjectsAggregate } from 'models/dbProject' import Link from 'next/link' import { v2v3ProjectRoute } from 'packages/v2v3/utils/routes' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' -import { v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { + v4ProjectRoute, + v5ProjectRoute, + v6ProjectRoute, +} from 'packages/v4v5/utils/routes' import { isHardArchived } from 'utils/archived' import { formatDate } from 'utils/format/formatDate' import { ArchivedBadge } from './ArchivedBadge' @@ -69,6 +73,11 @@ export default function ProjectCard({ projectId, chainId, }) + : pv === PV_V6 + ? v6ProjectRoute({ + projectId, + chainId, + }) : pv === PV_V2 ? v2v3ProjectRoute({ projectId, diff --git a/src/components/ProjectPageSEO.tsx b/src/components/ProjectPageSEO.tsx index 15dde683c8..9356299924 100644 --- a/src/components/ProjectPageSEO.tsx +++ b/src/components/ProjectPageSEO.tsx @@ -1,5 +1,5 @@ import { SiteBaseUrl } from 'constants/url' -import { JBChainId, toJbUrn } from 'juice-sdk-core' +import { JBChainId, toJbUrn } from '@bananapus/nana-sdk-core' import { ProjectMetadata } from 'models/projectMetadata' import { cidFromUrl, ipfsPublicGatewayUrl } from 'utils/ipfs' import { stripHtmlTags } from 'utils/string' diff --git a/src/components/Projects/ProjectsFilterAndSort.tsx b/src/components/Projects/ProjectsFilterAndSort.tsx index 2ad700010a..0a623cfcab 100644 --- a/src/components/Projects/ProjectsFilterAndSort.tsx +++ b/src/components/Projects/ProjectsFilterAndSort.tsx @@ -31,6 +31,9 @@ export default function ProjectsFilterAndSort({ includeV5, setIncludeV5, + includeV6, + setIncludeV6, + showArchived, setShowArchived, searchTags, @@ -52,6 +55,9 @@ export default function ProjectsFilterAndSort({ includeV5: boolean setIncludeV5: CheckboxOnChange + includeV6: boolean + setIncludeV6: CheckboxOnChange + showArchived: boolean setShowArchived: CheckboxOnChange searchTags: ProjectTagName[] @@ -184,6 +190,11 @@ export default function ProjectsFilterAndSort({ checked={includeV5} onChange={setIncludeV5} /> + (true) const [includeV4, setIncludeV4] = useState(true) const [includeV5, setIncludeV5] = useState(true) + const [includeV6, setIncludeV6] = useState(true) const [showArchived, setShowArchived] = useState(false) const [reversed, setReversed] = useState(false) @@ -76,9 +77,10 @@ export function ProjectsView() { if (includeV2) _pv.push(PV_V2) if (includeV4) _pv.push(PV_V4) if (includeV5) _pv.push(PV_V5) + if (includeV6) _pv.push(PV_V6) - return _pv.length ? _pv : [PV_V1, PV_V2, PV_V4, PV_V5] - }, [includeV1, includeV2, includeV4, includeV5]) + return _pv.length ? _pv : [PV_V1, PV_V2, PV_V4, PV_V5, PV_V6] + }, [includeV1, includeV2, includeV4, includeV5, includeV6]) function updateRoute( _searchTags: ProjectTagName[], @@ -144,10 +146,12 @@ export function ProjectsView() { includeV2={includeV2} includeV4={includeV4} includeV5={includeV5} + includeV6={includeV6} setIncludeV1={setIncludeV1} setIncludeV2={setIncludeV2} setIncludeV4={setIncludeV4} setIncludeV5={setIncludeV5} + setIncludeV6={setIncludeV6} showArchived={showArchived} setShowArchived={setShowArchived} reversed={reversed} diff --git a/src/components/Projects/TrendingProjectCard.tsx b/src/components/Projects/TrendingProjectCard.tsx index 1f64f92907..52fe0867d0 100644 --- a/src/components/Projects/TrendingProjectCard.tsx +++ b/src/components/Projects/TrendingProjectCard.tsx @@ -4,15 +4,19 @@ import { Skeleton } from 'antd' import ETHAmount from 'components/currency/ETHAmount' import Loading from 'components/Loading' import ProjectLogo from 'components/ProjectLogo' -import { PV_V2, PV_V4, PV_V5 } from 'constants/pv' +import { PV_V2, PV_V4, PV_V5, PV_V6 } from 'constants/pv' import { useProjectMetadata } from 'hooks/useProjectMetadata' import { useProjectTrendingPercentageIncrease } from 'hooks/useProjectTrendingPercentageIncrease' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { DBProject } from 'models/dbProject' import Link from 'next/link' import { v2v3ProjectRoute } from 'packages/v2v3/utils/routes' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' -import { v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { + v4ProjectRoute, + v5ProjectRoute, + v6ProjectRoute, +} from 'packages/v4v5/utils/routes' import { TRENDING_WINDOW_DAYS } from './RankingExplanation' export default function TrendingProjectCard({ @@ -65,7 +69,12 @@ export default function TrendingProjectCard({ prefetch={false} key={project.handle} href={ - project.pv === PV_V5 && project.chainIds?.length + project.pv === PV_V6 && project.chainIds?.length + ? v6ProjectRoute({ + projectId: project.projectId, + chainId: project.chainIds[0], + }) + : project.pv === PV_V5 && project.chainIds?.length ? v5ProjectRoute({ projectId: project.projectId, chainId: project.chainIds[0], diff --git a/src/components/ProtocolActivity/ChainFilterButtons.tsx b/src/components/ProtocolActivity/ChainFilterButtons.tsx index 18745d352c..9e99db22be 100644 --- a/src/components/ProtocolActivity/ChainFilterButtons.tsx +++ b/src/components/ProtocolActivity/ChainFilterButtons.tsx @@ -1,6 +1,6 @@ import { CheckIcon } from '@heroicons/react/24/outline' import { NETWORKS } from 'constants/networks' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' import React from 'react' import { twMerge } from 'tailwind-merge' diff --git a/src/components/ProtocolActivity/ProtocolActivityElement.tsx b/src/components/ProtocolActivity/ProtocolActivityElement.tsx index 7f760f0e78..491723a984 100644 --- a/src/components/ProtocolActivity/ProtocolActivityElement.tsx +++ b/src/components/ProtocolActivity/ProtocolActivityElement.tsx @@ -1,7 +1,7 @@ import EthereumAddress from 'components/EthereumAddress' import EtherscanLink from 'components/EtherscanLink' import ProjectLogo from 'components/ProjectLogo' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' import { formatHistoricalDate } from 'utils/format/formatDate' diff --git a/src/components/ProtocolActivity/ProtocolActivityList.tsx b/src/components/ProtocolActivity/ProtocolActivityList.tsx index c69268cd4d..4a902b468e 100644 --- a/src/components/ProtocolActivity/ProtocolActivityList.tsx +++ b/src/components/ProtocolActivity/ProtocolActivityList.tsx @@ -76,7 +76,7 @@ export function ProtocolActivityList() { ? v4v5ProjectRoute({ projectId: event.event.projectId, chainId: event.event.chainId, - version: 5, // Default to v5 for all bendystraw projects + version: event.event.projectVersion ?? 5, // Link by the project's own version, defaulting to v5 }) : null diff --git a/src/components/ProtocolActivity/utils/translateEventDataToProtocolPresenter.tsx b/src/components/ProtocolActivity/utils/translateEventDataToProtocolPresenter.tsx index 11351d6938..aeae41d349 100644 --- a/src/components/ProtocolActivity/utils/translateEventDataToProtocolPresenter.tsx +++ b/src/components/ProtocolActivity/utils/translateEventDataToProtocolPresenter.tsx @@ -1,6 +1,6 @@ import { BigNumber } from '@ethersproject/bignumber' import { AmountInCurrency } from 'components/currency/AmountInCurrency' -import { USDC_ADDRESSES } from 'juice-sdk-core' +import { USDC_ADDRESSES } from '@bananapus/nana-sdk-core' import { ETH_TOKEN_ADDRESS } from 'constants/juiceboxTokens' import { AnyEvent } from 'packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5ActivityPanel/utils/transformEventsData' import { formatActivityAmount } from 'utils/format/formatActivityAmount' diff --git a/src/components/QuickProjectSearch/QuickProjectSearchModal.tsx b/src/components/QuickProjectSearch/QuickProjectSearchModal.tsx index ff3d819405..db5b3ff021 100644 --- a/src/components/QuickProjectSearch/QuickProjectSearchModal.tsx +++ b/src/components/QuickProjectSearch/QuickProjectSearchModal.tsx @@ -13,14 +13,18 @@ import Modal from 'antd/lib/modal/Modal' import ETHAmount from 'components/currency/ETHAmount' import Loading from 'components/Loading' import { ProjectVersionBadge } from 'components/ProjectVersionBadge' -import { PV_V2, PV_V4, PV_V5 } from 'constants/pv' +import { PV_V2, PV_V4, PV_V5, PV_V6 } from 'constants/pv' import { useDBProjectsAggregateQuery } from 'hooks/useDBProjects' import { useRouter } from 'next/router' import V1ProjectHandle from 'packages/v1/components/shared/V1ProjectHandle' import V2V3ProjectHandleLink from 'packages/v2v3/components/shared/V2V3ProjectHandleLink' import { v2v3ProjectRoute } from 'packages/v2v3/utils/routes' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' -import { v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { + v4ProjectRoute, + v5ProjectRoute, + v6ProjectRoute, +} from 'packages/v4v5/utils/routes' import { twMerge } from 'tailwind-merge' import { QuickProjectSearchContext } from './QuickProjectSearchContext' @@ -53,11 +57,13 @@ export const QuickProjectSearchModal = () => { const project = searchResults[highlightIndex] const { projectId, handle, pv, chainId, chainIds } = project - // For V4/V5 projects from aggregate view, use first chainId from chainIds array + // For V4/V5/V6 projects from aggregate view, use first chainId from chainIds array const effectiveChainId = chainId ?? chainIds?.[0] router.push( - pv === PV_V5 + pv === PV_V6 + ? v6ProjectRoute({ chainId: effectiveChainId, projectId }) + : pv === PV_V5 ? v5ProjectRoute({ chainId: effectiveChainId, projectId }) : pv === PV_V4 ? v4ProjectRoute({ chainId: effectiveChainId, projectId }) @@ -192,7 +198,9 @@ export const QuickProjectSearchModal = () => { onClick={goToProject} onMouseEnter={() => setHighlightIndex(i)} > - {p.pv === PV_V5 ? ( + {p.pv === PV_V6 ? ( + p.name || `Project #${p.projectId}` + ) : p.pv === PV_V5 ? ( p.name || `Project #${p.projectId}` ) : p.pv === PV_V4 ? ( p.name || `Project #${p.projectId}` diff --git a/src/components/VolumeChart/components/TimelineChart.tsx b/src/components/VolumeChart/components/TimelineChart.tsx index 919e917e09..a14fb1aa1e 100644 --- a/src/components/VolumeChart/components/TimelineChart.tsx +++ b/src/components/VolumeChart/components/TimelineChart.tsx @@ -2,7 +2,7 @@ import { t } from '@lingui/macro' import CurrencySymbol from 'components/currency/CurrencySymbol' import { ThemeContext } from 'contexts/Theme/ThemeContext' import { useTrendingProjects } from 'hooks/useTrendingProjects' -import { USDC_ADDRESSES } from 'juice-sdk-core' +import { USDC_ADDRESSES } from '@bananapus/nana-sdk-core' import tailwind from 'lib/tailwind' import moment from 'moment' import { CSSProperties, useContext, useMemo } from 'react' diff --git a/src/components/VolumeChart/hooks/useProjectTimeline.ts b/src/components/VolumeChart/hooks/useProjectTimeline.ts index 6599d7d7d9..f9b69af2b6 100644 --- a/src/components/VolumeChart/hooks/useProjectTimeline.ts +++ b/src/components/VolumeChart/hooks/useProjectTimeline.ts @@ -7,7 +7,7 @@ import { useQuery } from '@tanstack/react-query' import { readProvider } from 'constants/readProvider' import { RomanStormVariables } from 'constants/romanStorm' import EthDater from 'ethereum-block-by-date' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { client } from 'lib/apollo/client' import { PV } from 'models/pv' import { useMemo } from 'react' diff --git a/src/components/common/CoreAppWrapper/CoreAppWrapper.tsx b/src/components/common/CoreAppWrapper/CoreAppWrapper.tsx index e727d66735..aa3a0b93e4 100644 --- a/src/components/common/CoreAppWrapper/CoreAppWrapper.tsx +++ b/src/components/common/CoreAppWrapper/CoreAppWrapper.tsx @@ -87,8 +87,8 @@ const _Wrapper: React.FC> = ({ }, []) // Check if we're on a project page (v4/v5 projects render their own activity panel) - const isProjectPage = router.pathname.startsWith('/v5/') || router.pathname.startsWith('/v4/') - const isProjectRoute = /^\/(v4|v5)\/[^\/]+/.test(router.asPath) + const isProjectPage = router.pathname.startsWith('/v6/') || router.pathname.startsWith('/v5/') || router.pathname.startsWith('/v4/') + const isProjectRoute = /^\/(v4|v5|v6)\/[^\/]+/.test(router.asPath) const showProtocolActivity = !isMobile && !(isProjectPage && isProjectRoute) return ( diff --git a/src/components/modals/IssueErc20TokenModal.tsx b/src/components/modals/IssueErc20TokenModal.tsx index a57a7fa760..d16243bb62 100644 --- a/src/components/modals/IssueErc20TokenModal.tsx +++ b/src/components/modals/IssueErc20TokenModal.tsx @@ -7,7 +7,7 @@ import { useRouter } from 'next/router' import { useState } from 'react' import { emitErrorNotification } from 'utils/notifications' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { useIssueErc20TokenTx } from 'hooks/useIssueErc20TokenTx' import { IssueErc20TokenTxArgs } from '../buttons/IssueErc20TokenButton' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/components/modals/TransactionModal.tsx b/src/components/modals/TransactionModal.tsx index 928a7888ec..f319fcb256 100644 --- a/src/components/modals/TransactionModal.tsx +++ b/src/components/modals/TransactionModal.tsx @@ -1,6 +1,6 @@ import { Trans, t } from '@lingui/macro' import { Modal, ModalProps } from 'antd' -import { JBChainId, RelayrGetBundleResponse } from 'juice-sdk-react' +import { JBChainId, RelayrGetBundleResponse } from '@bananapus/nana-sdk-react' import { PropsWithChildren, useContext, useMemo } from 'react' import { readNetwork } from 'constants/networks' diff --git a/src/constants/featureFlags.ts b/src/constants/featureFlags.ts index f2df9658cb..e625b07c4d 100644 --- a/src/constants/featureFlags.ts +++ b/src/constants/featureFlags.ts @@ -1,8 +1,9 @@ -export type FeatureFlag = 'SIMULATE_TXS' | 'V4' | 'V5' | 'OFAC' +export type FeatureFlag = 'SIMULATE_TXS' | 'V4' | 'V5' | 'V6' | 'OFAC' export const FEATURE_FLAGS: { [k in FeatureFlag]: string } = { SIMULATE_TXS: 'simulateTxs', V4: 'v4', V5: 'v5', + V6: 'v6', OFAC: 'ofac', } diff --git a/src/constants/networks.ts b/src/constants/networks.ts index d5322a80ac..4896293397 100644 --- a/src/constants/networks.ts +++ b/src/constants/networks.ts @@ -1,4 +1,4 @@ -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { NetworkName } from 'models/networkName' import { isBrowser } from 'utils/isBrowser' diff --git a/src/constants/pv.ts b/src/constants/pv.ts index 4555658452..89d2225668 100644 --- a/src/constants/pv.ts +++ b/src/constants/pv.ts @@ -1,5 +1,6 @@ -import { PV1, PV2, PV4, PV5 } from 'models/pv' +import { PV1, PV2, PV4, PV5, PV6 } from 'models/pv' +export const PV_V6: PV6 = '6' export const PV_V5: PV5 = '5' export const PV_V4: PV4 = '4' export const PV_V2: PV2 = '2' diff --git a/src/contexts/ProjectOFACProvider.tsx b/src/contexts/ProjectOFACProvider.tsx index b766c23254..fc7cb154d9 100644 --- a/src/contexts/ProjectOFACProvider.tsx +++ b/src/contexts/ProjectOFACProvider.tsx @@ -3,7 +3,7 @@ import { ReactNode, createContext } from 'react' import { useQuery } from '@tanstack/react-query' import axios from 'axios' import { useWallet } from 'hooks/Wallet' -import { useJBProjectMetadataContext } from 'juice-sdk-react' +import { useJBProjectMetadataContext } from '@bananapus/nana-sdk-react' interface ProjectOFACContextType { isLoading?: boolean diff --git a/src/contexts/Transaction/TxHistoryContext.ts b/src/contexts/Transaction/TxHistoryContext.ts index 36c54693fa..4e4cad4f94 100644 --- a/src/contexts/Transaction/TxHistoryContext.ts +++ b/src/contexts/Transaction/TxHistoryContext.ts @@ -1,4 +1,4 @@ -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { TransactionCallbacks, TxStatus } from 'models/transaction' import { createContext } from 'react' diff --git a/src/lib/api/supabase/projects/api.ts b/src/lib/api/supabase/projects/api.ts index 91b43edd8b..e1c1a65594 100644 --- a/src/lib/api/supabase/projects/api.ts +++ b/src/lib/api/supabase/projects/api.ts @@ -16,7 +16,7 @@ import { paginateDepleteQuery } from 'lib/apollo/paginateDepleteQuery' import { serverClient } from 'lib/apollo/serverClient' import { DBProject, DBProjectQueryOpts, SGSBCompareKey } from 'models/dbProject' import { Json } from 'models/json' -import { PV4, PV5 } from 'models/pv' +import { PV4, PV5, PV6 } from 'models/pv' import { NextApiRequest, NextApiResponse } from 'next' import { Dbv4V5ProjectsDocument, @@ -70,7 +70,7 @@ export async function queryAllSGProjectsForServer() { const v4v5Parsed = v4v5.map(p => { // p.version is non-null, but treat as optional to support bendystraw pre-v5 integration - const pv = (p.version?.toString() as PV4 | PV5) ?? PV_V4 + const pv = (p.version?.toString() as PV4 | PV5 | PV6) ?? PV_V4 return { ...p, diff --git a/src/locales/messages.pot b/src/locales/messages.pot index db3edb3323..301cca6d88 100644 --- a/src/locales/messages.pot +++ b/src/locales/messages.pot @@ -3770,6 +3770,9 @@ msgstr "" msgid "This project has no upcoming ruleset. Its rules can change at any time." msgstr "" +msgid "V6" +msgstr "" + msgid "Select NFTs to redeem" msgstr "" diff --git a/src/models/JB721Delegate.ts b/src/models/JB721Delegate.ts index 97a79d4c8b..e3f8e20893 100644 --- a/src/models/JB721Delegate.ts +++ b/src/models/JB721Delegate.ts @@ -1,3 +1,5 @@ +import { JB_721_TIER_PARAMS_V4 } from './nftRewards' + export enum JB721DelegateVersion { JB721DELEGATE_V3 = '3', JB721DELEGATE_V3_1 = '3-1', @@ -6,4 +8,68 @@ export enum JB721DelegateVersion { JB721DELEGATE_V3_4 = '3-4', JB721DELEGATE_V4 = '4', JB721DELEGATE_V5 = '5', + JB721DELEGATE_V6 = '6', +} + +/** + * Tier config shape expected by the v6 JB721TiersHook (e.g. `adjustTiers`). + * v6 nests the boolean flags into a `flags` tuple (adding `cantBuyWithCredits`) + * and adds reserved-token split support via `splitPercent`/`splits`. + */ +export type JB721TierConfigV6 = { + price: bigint + initialSupply: number + votingUnits: number + reserveFrequency: number + reserveBeneficiary: `0x${string}` + encodedIpfsUri: `0x${string}` + category: number + discountPercent: number + flags: { + allowOwnerMint: boolean + useReserveBeneficiaryAsDefault: boolean + transfersPausable: boolean + useVotingUnits: boolean + cantBeRemoved: boolean + cantIncreaseDiscountPercent: boolean + cantBuyWithCredits: boolean + } + splitPercent: number + splits: { + percent: number + projectId: bigint + beneficiary: `0x${string}` + preferAddToBalance: boolean + lockedUntil: number + hook: `0x${string}` + }[] +} + +/** + * Converts a v4/v5-shaped 721 tier config into the v6 tuple shape. + */ +export function jb721TierConfigToV6( + tier: JB_721_TIER_PARAMS_V4, +): JB721TierConfigV6 { + return { + price: tier.price, + initialSupply: tier.initialSupply, + votingUnits: tier.votingUnits, + reserveFrequency: tier.reserveFrequency, + reserveBeneficiary: tier.reserveBeneficiary, + encodedIpfsUri: tier.encodedIPFSUri, + category: tier.category, + discountPercent: tier.discountPercent, + flags: { + allowOwnerMint: tier.allowOwnerMint, + useReserveBeneficiaryAsDefault: tier.useReserveBeneficiaryAsDefault, + transfersPausable: tier.transfersPausable, + useVotingUnits: tier.useVotingUnits, + cantBeRemoved: tier.cannotBeRemoved, + cantIncreaseDiscountPercent: tier.cannotIncreaseDiscountPercent, + cantBuyWithCredits: false, + }, + splitPercent: 0, + splits: [], + } } diff --git a/src/models/dbProject.ts b/src/models/dbProject.ts index 6dcead002b..f28eb015e8 100644 --- a/src/models/dbProject.ts +++ b/src/models/dbProject.ts @@ -2,7 +2,7 @@ import { BigNumber } from '@ethersproject/bignumber' import { Database } from 'types/database.types' import { Project } from 'generated/graphql' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ProjectTagName } from './project-tags' import { PV } from './pv' type P = Project & { chainId: number; suckerGroupId: string } diff --git a/src/models/pv.ts b/src/models/pv.ts index ee3e6054ce..471c06661d 100644 --- a/src/models/pv.ts +++ b/src/models/pv.ts @@ -3,4 +3,5 @@ export type PV1 = '1' export type PV2 = '2' export type PV4 = '4' export type PV5 = '5' -export type PV = PV1 | PV2 | PV4 | PV5 +export type PV6 = '6' +export type PV = PV1 | PV2 | PV4 | PV5 | PV6 diff --git a/src/packages/v4v5/components/Allocation/AddEditAllocationModal.tsx b/src/packages/v4v5/components/Allocation/AddEditAllocationModal.tsx index f4bfb41af7..01734f0ad7 100644 --- a/src/packages/v4v5/components/Allocation/AddEditAllocationModal.tsx +++ b/src/packages/v4v5/components/Allocation/AddEditAllocationModal.tsx @@ -5,8 +5,8 @@ import { EthAddressInput } from 'components/inputs/EthAddressInput' import { JuiceDatePicker } from 'components/inputs/JuiceDatePicker' import { JuiceInputNumber } from 'components/inputs/JuiceInputNumber' import { LOCKED_PAYOUT_EXPLANATION } from 'components/strings' -import { JBCoreContracts, jbMultiTerminalAbi } from 'juice-sdk-core' -import { useJBContractContext } from 'juice-sdk-react' +import { useTerminalFee } from 'packages/v4v5/hooks/useTerminalFee' +import { useJBContractContext } from '@bananapus/nana-sdk-react' import moment, * as Moment from 'moment' import { isInfinitePayoutLimit } from 'packages/v4v5/utils/fundingCycle' import { useCallback, useEffect, useMemo, useState } from 'react' @@ -76,11 +76,7 @@ export const AddEditAllocationModal = ({ hideFee?: boolean }) => { const { contractAddress } = useJBContractContext() - const { data: primaryNativeTerminalFee } = useReadContract({ - abi: jbMultiTerminalAbi, - address: contractAddress(JBCoreContracts.JBMultiTerminal), - functionName: 'FEE', - }) + const primaryNativeTerminalFee = useTerminalFee() const { totalAllocationAmount, allocations, allocationCurrency } = Allocation.useAllocationInstance() diff --git a/src/packages/v4v5/components/Allocation/Allocation.tsx b/src/packages/v4v5/components/Allocation/Allocation.tsx index 2239b0ee06..69f400100f 100644 --- a/src/packages/v4v5/components/Allocation/Allocation.tsx +++ b/src/packages/v4v5/components/Allocation/Allocation.tsx @@ -1,4 +1,4 @@ -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import { FormItemInput } from 'models/formItemInput' import { V4V5CurrencyOption } from 'packages/v4v5/models/v4CurrencyOption' import { createContext, useContext } from 'react' diff --git a/src/packages/v4v5/components/Allocation/AllocationList.tsx b/src/packages/v4v5/components/Allocation/AllocationList.tsx index ca2fc59e97..59ffcd1605 100644 --- a/src/packages/v4v5/components/Allocation/AllocationList.tsx +++ b/src/packages/v4v5/components/Allocation/AllocationList.tsx @@ -3,7 +3,7 @@ import { t, Trans } from '@lingui/macro' import { CreateButton } from 'components/buttons/CreateButton/CreateButton' import { useModal } from 'hooks/useModal' -import { SplitPortion, SPLITS_TOTAL_PERCENT } from 'juice-sdk-core' +import { SplitPortion, SPLITS_TOTAL_PERCENT } from '@bananapus/nana-sdk-core' import round from 'lodash/round' import { amountFromPercent } from 'packages/v4v5/utils/distributions' import { MAX_PAYOUT_LIMIT } from 'packages/v4v5/utils/math' diff --git a/src/packages/v4v5/components/Allocation/components/AllocationItemTitle.tsx b/src/packages/v4v5/components/Allocation/components/AllocationItemTitle.tsx index cc05d6f94c..0710c86b61 100644 --- a/src/packages/v4v5/components/Allocation/components/AllocationItemTitle.tsx +++ b/src/packages/v4v5/components/Allocation/components/AllocationItemTitle.tsx @@ -2,7 +2,7 @@ import { LockFilled } from '@ant-design/icons' import { t } from '@lingui/macro' import { Tooltip } from 'antd' import EthereumAddress from 'components/EthereumAddress' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { isProjectSplit } from 'packages/v4v5/utils/v4Splits' import { formatDate } from 'utils/format/formatDate' import { useChainId } from 'wagmi' diff --git a/src/packages/v4v5/components/ChainLogo.tsx b/src/packages/v4v5/components/ChainLogo.tsx index 4b93127cfe..48287af4a6 100644 --- a/src/packages/v4v5/components/ChainLogo.tsx +++ b/src/packages/v4v5/components/ChainLogo.tsx @@ -1,6 +1,6 @@ import { Tooltip } from 'antd' import { NETWORKS } from 'constants/networks' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import Image from 'next/image' import { arbitrum, diff --git a/src/packages/v4v5/components/ChainSelect.tsx b/src/packages/v4v5/components/ChainSelect.tsx index f3b0776792..cecc25fbae 100644 --- a/src/packages/v4v5/components/ChainSelect.tsx +++ b/src/packages/v4v5/components/ChainSelect.tsx @@ -12,7 +12,7 @@ import { import { t } from '@lingui/macro' import { JuiceListbox } from 'components/inputs/JuiceListbox' import { NETWORKS } from 'constants/networks' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import React from 'react' import { ChainLogo } from './ChainLogo' diff --git a/src/packages/v4v5/components/Create/Create.tsx b/src/packages/v4v5/components/Create/Create.tsx index be7ac05571..b4a87f1f1e 100644 --- a/src/packages/v4v5/components/Create/Create.tsx +++ b/src/packages/v4v5/components/Create/Create.tsx @@ -2,7 +2,7 @@ import { Trans, t } from '@lingui/macro' import { DEADLINE_EXPLANATION, RULESET_EXPLANATION } from 'components/strings' import Loading from 'components/Loading' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { useRouter } from 'next/router' import { useMemo } from 'react' import { CreateBadge } from './components/CreateBadge' diff --git a/src/packages/v4v5/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx b/src/packages/v4v5/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx index dd5866dd88..2693af9b9e 100644 --- a/src/packages/v4v5/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ProjectDetails/ProjectDetailsPage.tsx @@ -2,7 +2,7 @@ import * as constants from '@ethersproject/constants' import { Trans, t } from '@lingui/macro' import { Col, Form, Row } from 'antd' -import { JBChainId, JB_CHAINS } from 'juice-sdk-core' +import { JBChainId, JB_CHAINS } from '@bananapus/nana-sdk-core' import { V2V3_CURRENCY_ETH, V2V3_CURRENCY_USD, diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx index 0787b0885d..518b56762a 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/ReviewDeployPage.tsx @@ -2,7 +2,7 @@ import { Checkbox, Form } from 'antd' import { jb721TiersHookProjectDeployerAbi, jbControllerAbi, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import React, { useCallback, useContext, @@ -32,7 +32,7 @@ import { useGnosisSafe } from 'hooks/safe/useGnosisSafe' import useMobile from 'hooks/useMobile' import { useModal } from 'hooks/useModal' import { useWallet } from 'hooks/Wallet' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { uploadProjectMetadata } from 'lib/api/ipfs' import { useRouter } from 'next/router' import QueueSafeLaunchProjectTxsModal from 'packages/v4v5/components/QueueSafeTxsModal/QueueSafeLaunchProjectTxsModal' @@ -138,14 +138,14 @@ export const ReviewDeployPage = () => { const [standardProjectLaunchData, setStandardProjectLaunchData] = useState<{ [k in JBChainId]?: ContractFunctionArgs< typeof jbControllerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }>() const [nftProjectLaunchData, setNftProjectLaunchData] = useState<{ [k in JBChainId]?: ContractFunctionArgs< typeof jb721TiersHookProjectDeployerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }>() @@ -208,7 +208,7 @@ export const ReviewDeployPage = () => { {} as { [k in JBChainId]?: ContractFunctionArgs< typeof jb721TiersHookProjectDeployerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }, @@ -229,7 +229,7 @@ export const ReviewDeployPage = () => { {} as { [k in JBChainId]?: ContractFunctionArgs< typeof jbControllerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }, diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/CreateChainSelectButton.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/CreateChainSelectButton.tsx index 68591e2ee9..060955a939 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/CreateChainSelectButton.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/CreateChainSelectButton.tsx @@ -1,5 +1,5 @@ import { CheckIcon } from '@heroicons/react/24/outline' -import { JB_CHAINS, JBChainId } from 'juice-sdk-core' +import { JB_CHAINS, JBChainId } from '@bananapus/nana-sdk-core' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' import React, { useState } from 'react' import { twMerge } from 'tailwind-merge' diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/DeploySuccess.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/DeploySuccess.tsx index 8e23f85cbd..78f2ec2392 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/DeploySuccess.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/DeploySuccess.tsx @@ -2,12 +2,12 @@ import { ShareAltOutlined, TwitterOutlined } from '@ant-design/icons' import { Trans, t } from '@lingui/macro' import { Button } from 'antd' import ExternalLink from 'components/ExternalLink' -import { JB_CHAINS } from 'juice-sdk-core' -import { JBChainId } from 'juice-sdk-react' +import { JB_CHAINS } from '@bananapus/nana-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-react' import Image from 'next/legacy/image' import { useRouter } from 'next/router' import V4V5ProjectHandleLink from 'packages/v4v5/components/V4V5ProjectHandleLink' -import { v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { v6ProjectRoute } from 'packages/v4v5/utils/routes' import { useMemo } from 'react' import DeploySuccessHero from '/public/assets/images/create-success-hero.webp' @@ -28,7 +28,7 @@ export const DeploySuccess = ({ if (!projectIds || projectIds.length === 0) { return '' } - const juiceboxUrl = v5ProjectRoute(projectIds[0]) + const juiceboxUrl = v6ProjectRoute(projectIds[0]) const chain = JB_CHAINS[projectIds[0].chainId] const message = `Check out my project on ${ diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/LaunchProjectModal.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/LaunchProjectModal.tsx index 670d6be303..143f76b975 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/LaunchProjectModal.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/LaunchProjectModal.tsx @@ -10,12 +10,12 @@ import { Trans, t } from '@lingui/macro' import { jb721TiersHookProjectDeployerAbi, jbControllerAbi, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { RelayrPostBundleResponse, useGetRelayrTxBundle, useSendRelayrTx, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import React, { useCallback, useEffect, useState } from 'react' import { ContractFunctionArgs, hexToBigInt } from 'viem' import { mainnet, sepolia } from 'viem/chains' @@ -27,7 +27,7 @@ import ETHAmount from 'components/currency/ETHAmount' import Loading from 'components/Loading' import { JuiceModal } from 'components/modals/JuiceModal' import { NETWORKS } from 'constants/networks' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { uploadProjectMetadata } from 'lib/api/ipfs' import { useRouter } from 'next/router' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' @@ -139,7 +139,7 @@ export const LaunchProjectModal: React.FC<{ acc: { [k in JBChainId]?: ContractFunctionArgs< typeof jb721TiersHookProjectDeployerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }, @@ -167,7 +167,7 @@ export const LaunchProjectModal: React.FC<{ acc: { [k in JBChainId]?: ContractFunctionArgs< typeof jbControllerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }, diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/OmnichainTxLoadingContent.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/OmnichainTxLoadingContent.tsx index b30380d682..e944efaa04 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/OmnichainTxLoadingContent.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/OmnichainTxLoadingContent.tsx @@ -5,8 +5,8 @@ import { ChainLogo } from 'packages/v4v5/components/ChainLogo' import EtherscanLink from 'components/EtherscanLink' import { Hash } from 'viem' import Image from 'next/image' -import { JBChainId } from 'juice-sdk-core' -import { RelayrGetBundleResponse } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-core' +import { RelayrGetBundleResponse } from '@bananapus/nana-sdk-react' import { Skeleton } from 'antd' interface ChainTxLinkProps { diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/TxLoadingContent.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/TxLoadingContent.tsx index 395ca2e99f..54d26ebbeb 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/TxLoadingContent.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/LaunchProjectModal/TxLoadingContent.tsx @@ -3,7 +3,7 @@ import { Trans, t } from '@lingui/macro' import EtherscanLink from 'components/EtherscanLink' import { Hash } from 'viem' import Image from 'next/image' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' export function TxLoadingContent({ txHash, diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/ProjectDetailsReview/ProjectDetailsReview.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/ProjectDetailsReview/ProjectDetailsReview.tsx index 148e20e0bd..3a1bb1b881 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/ProjectDetailsReview/ProjectDetailsReview.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/ProjectDetailsReview/ProjectDetailsReview.tsx @@ -5,7 +5,7 @@ import ProjectLogo from 'components/ProjectLogo' import { ProjectTagsList } from 'components/ProjectTags/ProjectTagsList' import { RichPreview } from 'components/RichPreview/RichPreview' import { useWallet } from 'hooks/Wallet' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { useMemo } from 'react' import { useAppSelector } from 'redux/hooks/useAppSelector' import { ipfsUriToGatewayUrl } from 'utils/ipfs' diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/RulesReview.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/RulesReview.tsx index 3c4c9c9894..684e4354e3 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/RulesReview.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/RulesReview.tsx @@ -1,6 +1,6 @@ import EthereumAddress from 'components/EthereumAddress' import { FEATURE_FLAGS } from 'constants/featureFlags' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ReviewDescription } from '../ReviewDescription' import { featureFlagEnabled } from 'utils/featureFlags' import { t } from '@lingui/macro' diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/hooks/useRulesReview.ts b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/hooks/useRulesReview.ts index 6443347fce..caa93a9c3a 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/hooks/useRulesReview.ts +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/RulesReview/hooks/useRulesReview.ts @@ -4,7 +4,7 @@ import { formatPaused, } from 'utils/format/formatBoolean' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { getAvailableApprovalStrategies } from 'packages/v4v5/utils/approvalHooks' import { useMemo } from 'react' diff --git a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/SafeQueueSuccess.tsx b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/SafeQueueSuccess.tsx index 365a185bbb..295faf8603 100644 --- a/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/SafeQueueSuccess.tsx +++ b/src/packages/v4v5/components/Create/components/pages/ReviewDeploy/components/SafeQueueSuccess.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' import { Button } from 'antd' import ExternalLink from 'components/ExternalLink' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import Image from 'next/legacy/image' import DeploySuccessHero from '/public/assets/images/create-success-hero.webp' diff --git a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useDeployNftProject.ts b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useDeployNftProject.ts index e762475e0e..4256877633 100644 --- a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useDeployNftProject.ts +++ b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useDeployNftProject.ts @@ -4,7 +4,7 @@ import { Address, parseEther, zeroAddress } from 'viem' import { ONE_BILLION } from 'constants/numbers' import { DEFAULT_JB_721_TIER_CATEGORY } from 'constants/transactionDefaults' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { useLaunchProjectWithNftsTx } from 'packages/v4v5/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx' import { LaunchTxOpts } from 'packages/v4v5/hooks/useLaunchProjectTx' import { useCallback } from 'react' diff --git a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useNftProjectLaunchData.ts b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useNftProjectLaunchData.ts index c8254de315..c1ede4fd9e 100644 --- a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useNftProjectLaunchData.ts +++ b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useNftProjectLaunchData.ts @@ -3,8 +3,8 @@ import { jbContractAddress, JBCoreContracts, NATIVE_TOKEN_DECIMALS, -} from 'juice-sdk-core' -import { JBChainId } from 'juice-sdk-react' +} from '@bananapus/nana-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-react' import { JBTiered721Flags, NftRewardTier } from 'models/nftRewards' import { JB721TierConfig, @@ -25,6 +25,39 @@ import { useStandardProjectLaunchData } from '../useStandardProjectLaunchData' import { DEFAULT_NFT_MAX_SUPPLY } from './useDeployNftProject' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' +// v6: JB721TierConfig drifted (encodedIpfsUri casing, nested flags tuple with cant* +// naming, new splitPercent/splits fields) and JB721InitTiersConfig dropped `prices`. +// We emit BOTH the v5 and v6 key spellings on the same object so it encodes correctly +// under whichever ABI the caller picks by version (viem selects tuple fields by name). +type JB721TierConfigDual = JB721TierConfig & { + encodedIpfsUri: `0x${string}` + splitPercent: number + splits: never[] + flags: { + allowOwnerMint: boolean + useReserveBeneficiaryAsDefault: boolean + transfersPausable: boolean + useVotingUnits: boolean + cantBeRemoved: boolean + cantIncreaseDiscountPercent: boolean + cantBuyWithCredits: boolean + } +} + +type JB721TiersHookFlagsDual = JB721TiersHookFlags & { + issueTokensForSplits: boolean +} + +type JBDeploy721TiersHookConfigDual = Omit< + JBDeploy721TiersHookConfig, + 'tiersConfig' | 'flags' +> & { + tiersConfig: Omit & { + tiers: JB721TierConfigDual[] + } + flags: JB721TiersHookFlagsDual +} + export function useNftProjectLaunchData() { const { version } = useV4V5Version() const { projectMetadata, nftRewards, mustStartAtOrAfter } = useAppSelector( @@ -58,7 +91,7 @@ export function useNftProjectLaunchData() { withStartBuffer?: boolean }) => { // Use version-specific JBController - const defaultJBController = jbContractAddress[version.toString() as '4' | '5'][ + const defaultJBController = jbContractAddress[version.toString() as '4' | '5' | '6'][ JBCoreContracts.JBController ][chainId as JBChainId] as Address @@ -81,7 +114,7 @@ export function useNftProjectLaunchData() { }) const flags = toV4Flags(nftFlags) - const deployTiered721HookData: JBDeploy721TiersHookConfig = { + const deployTiered721HookData: JBDeploy721TiersHookConfigDual = { name: collectionName, symbol: collectionSymbol, baseUri: ipfsUri(''), @@ -90,11 +123,13 @@ export function useNftProjectLaunchData() { tiersConfig: { currency, decimals: NATIVE_TOKEN_DECIMALS, - prices: jbContractAddress[version.toString() as '4' | '5'][JBCoreContracts.JBPrices][ + // v5 only: v6's JB721InitTiersConfig has no `prices` field (ignored by the v6 ABI). + prices: jbContractAddress[version.toString() as '4' | '5' | '6'][JBCoreContracts.JBPrices][ chainId as JBChainId ] as Address, tiers, }, + // v5 only: dropped from the v6 struct (ignored by the v6 ABI). reserveBeneficiary: zeroAddress, flags, } @@ -130,7 +165,7 @@ function buildJB721TierParams({ }: { cids: string[] rewardTiers: NftRewardTier[] -}): JB721TierConfig[] { +}): JB721TierConfigDual[] { const sortedRewardTiers = sortNftsByContributionFloor(rewardTiers) return cids.map((cid, index) => { @@ -140,19 +175,21 @@ function buildJB721TierParams({ }) } -function toV4Flags(v2v3Flags: JBTiered721Flags): JB721TiersHookFlags { +function toV4Flags(v2v3Flags: JBTiered721Flags): JB721TiersHookFlagsDual { return { noNewTiersWithOwnerMinting: v2v3Flags.lockManualMintingChanges, noNewTiersWithReserves: v2v3Flags.lockReservedTokenChanges, noNewTiersWithVotes: v2v3Flags.lockVotingUnitChanges, preventOverspending: v2v3Flags.preventOverspending, + // v6 only: keep reserved-split minting off (matches v5 behavior). + issueTokensForSplits: false, } } function nftRewardTierToJB721TierConfig( rewardTier: NftRewardTier, cid: string, -): JB721TierConfig { +): JB721TierConfigDual { const price = parseEther(rewardTier.contributionFloor.toString()) const initialSupply = rewardTier.maxSupply ?? DEFAULT_NFT_MAX_SUPPLY const encodedIPFSUri = encodeIpfsUri(cid) as `0x${string}` @@ -171,13 +208,30 @@ function nftRewardTierToJB721TierConfig( votingUnits, reserveFrequency, reserveBeneficiary, + // v5 spelling. encodedIPFSUri, + // v6 spelling. + encodedIpfsUri: encodedIPFSUri, + // v5 flat flags. allowOwnerMint: false, useReserveBeneficiaryAsDefault: false, transfersPausable: false, useVotingUnits: true, cannotBeRemoved: false, cannotIncreaseDiscountPercent: false, + // v6 nested flags tuple. + flags: { + allowOwnerMint: false, + useReserveBeneficiaryAsDefault: false, + transfersPausable: false, + useVotingUnits: true, + cantBeRemoved: false, + cantIncreaseDiscountPercent: false, + cantBuyWithCredits: false, + }, + // v6 only: no per-tier splits. + splitPercent: 0, + splits: [], discountPercent: 0, category: DEFAULT_JB_721_TIER_CATEGORY, } diff --git a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployOmnichainProject.ts b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployOmnichainProject.ts index f7489bba0e..7f5d8d6c8c 100644 --- a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployOmnichainProject.ts +++ b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployOmnichainProject.ts @@ -3,33 +3,99 @@ import { jb721TiersHookProjectDeployerAbi, JBChainId, jbContractAddress, - jbController4_1Abi, + jbControllerAbi, JBCoreContracts, jbOmnichainDeployer4_1Abi, + jbOmnichainDeployerAbi, JBOmnichainDeployerContracts, + jbProjectsAbi, + MappableAsset, parseSuckerDeployerConfig, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { useGetRelayrTxBundle, useGetRelayrTxQuote, useSendRelayrTx, -} from 'juice-sdk-react' -import { ContractFunctionArgs, encodeFunctionData } from 'viem' +} from '@bananapus/nana-sdk-react' +import { readContract } from '@wagmi/core' +import { + Address, + Chain, + Client, + ContractFunctionArgs, + encodeFunctionData, + PublicClient, + Transport, +} from 'viem' +import { estimateGas } from 'viem/actions' +import { wagmiConfig } from 'contexts/Para/Providers' import { useWallet } from 'hooks/Wallet' +import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { estimateContractGasWithFallback, OMNICHAIN_GAS_FALLBACKS } from 'packages/v4v5/utils/estimateOmnichainGas' +const GAS_BUFFER_PERCENT = 120n // 20% buffer + +// v6: sucker deployer configs use bytes32 peer/remoteToken. +type V6SuckerDeployerConfigurations = { + deployer: `0x${string}` + peer: `0x${string}` + mappings: { + localToken: `0x${string}` + minGas: number + remoteToken: `0x${string}` + }[] +}[] + +/** + * Estimates gas for a payable call (the shared helper doesn't send value, so v6 + * launches - which require msg.value == creationFee - would always revert). + * Falls back if estimation fails, e.g. the wallet doesn't hold the fee on this + * chain; Relayr re-simulates server-side. + */ +async function estimatePayableGasWithFallback({ + chainId, + to, + data, + value, + userAddress, + fallbackGas, +}: { + chainId: JBChainId + to: Address + data: `0x${string}` + value: bigint + userAddress: Address + fallbackGas: bigint +}): Promise { + try { + const client = wagmiConfig.getClient({ chainId }) as Client + + const gasEstimate = await estimateGas(client as PublicClient, { + to, + data, + account: userAddress, + value, + }) + + return (gasEstimate * GAS_BUFFER_PERCENT) / 100n + } catch { + return fallbackGas + } +} + export function useDeployOmnichainProject() { const { userAddress } = useWallet() const { getRelayrTxQuote } = useGetRelayrTxQuote() const { sendRelayrTx } = useSendRelayrTx() const relayrBundle = useGetRelayrTxBundle() + const { version } = useV4V5Version() async function deployOmnichainProject( deployData: { [k in JBChainId]?: ContractFunctionArgs< - typeof jbController4_1Abi, - 'nonpayable', + typeof jbControllerAbi, + 'payable', 'launchProjectFor' > }, @@ -42,16 +108,77 @@ export function useDeployOmnichainProject() { const relayrTransactions = await Promise.all( chainIds.map(async chainId => { - const suckerDeploymentConfiguration = parseSuckerDeployerConfig( - chainId, - chainIds, - ) - const chainDeployData = deployData[chainId] if (!chainDeployData) { throw new Error('No deploy data for chain: ' + chainId) } + if (version === 6) { + const suckerDeploymentConfiguration = parseSuckerDeployerConfig( + chainId, + chainIds, + [MappableAsset.NATIVE], + { version: 6 }, + ) + + const args = [ + chainDeployData[0], + chainDeployData[1], + chainDeployData[2], + chainDeployData[3], + chainDeployData[4], + { + deployerConfigurations: + suckerDeploymentConfiguration.deployerConfigurations as V6SuckerDeployerConfigurations, + salt, + }, + ] as const + + const omnichainDeployerAddress = jbContractAddress['6'][ + JBOmnichainDeployerContracts.JBOmnichainDeployer + ][chainId] + + const encodedData = encodeFunctionData({ + abi: jbOmnichainDeployerAbi, + functionName: 'launchProjectFor', + args, + }) + + // v6: the launch is payable and requires msg.value == JBProjects.creationFee() exactly. + const creationFee = await readContract(wagmiConfig, { + address: jbContractAddress['6'][JBCoreContracts.JBProjects][chainId], + abi: jbProjectsAbi, + functionName: 'creationFee', + chainId, + }) + + const gas = await estimatePayableGasWithFallback({ + chainId, + to: omnichainDeployerAddress, + data: encodedData, + value: creationFee, + userAddress, + fallbackGas: OMNICHAIN_GAS_FALLBACKS.LAUNCH_PROJECT, + }) + + return { + data: { + from: userAddress, + to: omnichainDeployerAddress, + value: creationFee, + gas, + data: encodedData, + }, + chainId, + version: 6 as const, + } + } + + const suckerDeploymentConfiguration = parseSuckerDeployerConfig( + chainId, + chainIds, + ) + const baseArgs = [ chainDeployData[0], chainDeployData[1], @@ -67,7 +194,13 @@ export function useDeployOmnichainProject() { // Always use v5 JBController const controllerAddress = jbContractAddress['5'][JBCoreContracts.JBController][chainId] - const args = [...baseArgs, controllerAddress as `0x${string}`] as const + // The launch data carries both the v5 and v6 metadata key spellings, so it + // encodes correctly under the v5 ABI too. + const args = [...baseArgs, controllerAddress as `0x${string}`] as unknown as ContractFunctionArgs< + typeof jbOmnichainDeployer4_1Abi, + 'nonpayable', + 'launchProjectFor' + > // Always use v5 JBOmnichainDeployer const omnichainDeployerAddress = jbContractAddress['5'][ @@ -110,7 +243,7 @@ export function useDeployOmnichainProject() { deployData: { [k in JBChainId]?: ContractFunctionArgs< typeof jb721TiersHookProjectDeployerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' > }, @@ -124,16 +257,99 @@ export function useDeployOmnichainProject() { const relayrTransactions = await Promise.all( chainIds.map(async chainId => { - const suckerDeploymentConfiguration = parseSuckerDeployerConfig( - chainId, - chainIds, - ) - const chainDeployData = deployData[chainId] if (!chainDeployData) { throw new Error('No deploy data for chain: ' + chainId) } + if (version === 6) { + const suckerDeploymentConfiguration = parseSuckerDeployerConfig( + chainId, + chainIds, + [MappableAsset.NATIVE], + { version: 6 }, + ) + + // v6: JBOmnichainDeployer takes a single payable launchProjectFor overload with + // the 721 config unpacked alongside the project config (no separate + // launch721ProjectFor, no controller arg). + const [owner, deployTiersHookConfig, launchProjectConfig] = + chainDeployData + + const args = [ + owner, + launchProjectConfig.projectUri, + { + deployTiersHookConfig, + useDataHookForCashOut: + launchProjectConfig.rulesetConfigurations[0]?.metadata + .useDataHookForCashOut ?? false, + salt, + }, + // The 721 deployer type strips useDataHookForPay/dataHook from the ruleset + // metadata, but the omnichain overload (and the runtime objects, which come + // from the standard transformer) carry the full metadata. + launchProjectConfig.rulesetConfigurations as unknown as ContractFunctionArgs< + typeof jbControllerAbi, + 'payable', + 'launchProjectFor' + >[2], + launchProjectConfig.terminalConfigurations, + launchProjectConfig.memo, + { + deployerConfigurations: + suckerDeploymentConfiguration.deployerConfigurations as V6SuckerDeployerConfigurations, + salt, + }, + ] as const + + const omnichainDeployerAddress = jbContractAddress['6'][ + JBOmnichainDeployerContracts.JBOmnichainDeployer + ][chainId] + + const encodedData = encodeFunctionData({ + abi: jbOmnichainDeployerAbi, + functionName: 'launchProjectFor', + args, + }) + + // v6: the launch is payable and requires msg.value == JBProjects.creationFee() exactly. + const creationFee = await readContract(wagmiConfig, { + address: jbContractAddress['6'][JBCoreContracts.JBProjects][chainId], + abi: jbProjectsAbi, + functionName: 'creationFee', + chainId, + }) + + const gas = await estimatePayableGasWithFallback({ + chainId, + to: omnichainDeployerAddress, + data: encodedData, + value: creationFee, + userAddress, + fallbackGas: OMNICHAIN_GAS_FALLBACKS.LAUNCH_NFT_PROJECT, + }) + + return { + data: { + from: userAddress, + to: omnichainDeployerAddress, + value: creationFee, + gas, + data: encodedData, + }, + chainId, + version: 6 as const, + } + } + + const suckerDeploymentConfiguration = parseSuckerDeployerConfig( + chainId, + chainIds, + ) + + // The launch data carries both the v5 and v6 721 config key spellings, so it + // encodes correctly under the v5 ABI too. const args = [ chainDeployData[0], chainDeployData[1], @@ -145,7 +361,11 @@ export function useDeployOmnichainProject() { salt, }, jbContractAddress['5'][JBCoreContracts.JBController][chainId] as `0x${string}`, - ] as const + ] as unknown as ContractFunctionArgs< + typeof jbOmnichainDeployer4_1Abi, + 'nonpayable', + 'launch721ProjectFor' + > // Always use v5 JBOmnichainDeployer const omnichainDeployerAddress = jbContractAddress['5'][ diff --git a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployStandardProject.ts b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployStandardProject.ts index 89ffac617f..f3d31e1eb0 100644 --- a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployStandardProject.ts +++ b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useDeployStandardProject.ts @@ -1,4 +1,4 @@ -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { LaunchTxOpts, useLaunchProjectTx, diff --git a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useStandardProjectLaunchData.ts b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useStandardProjectLaunchData.ts index e7ac01141f..f734924c8f 100644 --- a/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useStandardProjectLaunchData.ts +++ b/src/packages/v4v5/components/Create/hooks/DeployProject/hooks/useStandardProjectLaunchData.ts @@ -4,7 +4,7 @@ import { jbContractAddress, JBCoreContracts, NATIVE_TOKEN, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { LaunchV2V3ProjectArgs, transformV2V3CreateArgsToV4, @@ -51,8 +51,10 @@ export function useStandardProjectLaunchData() { chainId: JBChainId withStartBuffer?: boolean }) => { + const versionKey = String(version) as '4' | '5' | '6' + const terminalAddress = chainId - ? (jbContractAddress['5'][JBCoreContracts.JBMultiTerminal][ + ? (jbContractAddress[versionKey][JBCoreContracts.JBMultiTerminal][ chainId as JBChainId ] as Address) : undefined @@ -62,7 +64,7 @@ export function useStandardProjectLaunchData() { } const controllerAddress = chainId - ? (jbContractAddress['5'][JBCoreContracts.JBController][ + ? (jbContractAddress[versionKey][JBCoreContracts.JBController][ chainId as JBChainId ] as Address) : undefined diff --git a/src/packages/v4v5/components/Create/hooks/DeployProject/useDeployProject.ts b/src/packages/v4v5/components/Create/hooks/DeployProject/useDeployProject.ts index 8de303dace..98a0f13f25 100644 --- a/src/packages/v4v5/components/Create/hooks/DeployProject/useDeployProject.ts +++ b/src/packages/v4v5/components/Create/hooks/DeployProject/useDeployProject.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import { useAppSelector } from 'redux/hooks/useAppSelector' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { uploadProjectMetadata } from 'lib/api/ipfs' import { LaunchTxOpts } from 'packages/v4v5/hooks/useLaunchProjectTx' import { useAppDispatch } from 'redux/hooks/useAppDispatch' diff --git a/src/packages/v4v5/components/FeeTooltipLabel.tsx b/src/packages/v4v5/components/FeeTooltipLabel.tsx index 5fdd30357d..71a763b635 100644 --- a/src/packages/v4v5/components/FeeTooltipLabel.tsx +++ b/src/packages/v4v5/components/FeeTooltipLabel.tsx @@ -2,8 +2,8 @@ import { Trans } from '@lingui/macro' import ExternalLink from 'components/ExternalLink' import TooltipLabel from 'components/TooltipLabel' import CurrencySymbol from 'components/currency/CurrencySymbol' -import { Ether } from 'juice-sdk-core' -import { NativeTokenValue } from 'juice-sdk-react' +import { Ether } from '@bananapus/nana-sdk-core' +import { NativeTokenValue } from '@bananapus/nana-sdk-react' import { formatWad } from 'utils/format/formatNumber' import { helpPagePath } from 'utils/helpPagePath' import { V4V5CurrencyOption } from '../models/v4CurrencyOption' diff --git a/src/packages/v4v5/components/PayoutsTable/ConvertAmountsModal.tsx b/src/packages/v4v5/components/PayoutsTable/ConvertAmountsModal.tsx index 5e81507486..f68a381f6e 100644 --- a/src/packages/v4v5/components/PayoutsTable/ConvertAmountsModal.tsx +++ b/src/packages/v4v5/components/PayoutsTable/ConvertAmountsModal.tsx @@ -17,7 +17,7 @@ import EthereumAddress from 'components/EthereumAddress' import { ExternalLinkWithIcon } from 'components/ExternalLinkWithIcon' import FormattedNumberInput from 'components/inputs/FormattedNumberInput' import { Parenthesis } from 'components/Parenthesis' -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import { ReduxPayoutLimit } from 'packages/v4v5/models/fundAccessLimits' import { V4V5CurrencyOption } from 'packages/v4v5/models/v4CurrencyOption' import { formatCurrencyAmount } from 'packages/v4v5/utils/formatCurrencyAmount' diff --git a/src/packages/v4v5/components/PayoutsTable/PayoutSplitRow.tsx b/src/packages/v4v5/components/PayoutsTable/PayoutSplitRow.tsx index 436fed412e..9a71fda394 100644 --- a/src/packages/v4v5/components/PayoutsTable/PayoutSplitRow.tsx +++ b/src/packages/v4v5/components/PayoutsTable/PayoutSplitRow.tsx @@ -1,7 +1,7 @@ import FormattedNumberInput from 'components/inputs/FormattedNumberInput' import { PayoutsTableCell } from 'components/PayoutsTable/PayoutsTableCell' import { PayoutsTableRow } from 'components/PayoutsTable/PayoutsTableRow' -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import round from 'lodash/round' import { useState } from 'react' import { AddEditAllocationModal, AddEditAllocationModalEntity } from '../Allocation/AddEditAllocationModal' diff --git a/src/packages/v4v5/components/PayoutsTable/PayoutTitle.tsx b/src/packages/v4v5/components/PayoutsTable/PayoutTitle.tsx index b525d32648..f274d08eb0 100644 --- a/src/packages/v4v5/components/PayoutsTable/PayoutTitle.tsx +++ b/src/packages/v4v5/components/PayoutsTable/PayoutTitle.tsx @@ -2,7 +2,7 @@ import { LockClosedIcon } from '@heroicons/react/24/solid' import { t } from '@lingui/macro' import { Tooltip } from 'antd' import EthereumAddress from 'components/EthereumAddress' -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import { formatDate } from 'utils/format/formatDate' import { useChainId } from 'wagmi' import V4V5ProjectHandleLink from '../V4V5ProjectHandleLink' diff --git a/src/packages/v4v5/components/PayoutsTable/context/PayoutsTableContext.tsx b/src/packages/v4v5/components/PayoutsTable/context/PayoutsTableContext.tsx index b5ea4b85b7..7287b744c4 100644 --- a/src/packages/v4v5/components/PayoutsTable/context/PayoutsTableContext.tsx +++ b/src/packages/v4v5/components/PayoutsTable/context/PayoutsTableContext.tsx @@ -1,7 +1,7 @@ import { ReactNode, createContext, useContext } from 'react' import { CurrencyName } from 'constants/currency' -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import { TreasurySelection } from 'models/treasurySelection' export interface PayoutsTableContextProps { diff --git a/src/packages/v4v5/components/PayoutsTable/hooks/usePayoutsTable.tsx b/src/packages/v4v5/components/PayoutsTable/hooks/usePayoutsTable.tsx index d9f665f87b..ef4707866b 100644 --- a/src/packages/v4v5/components/PayoutsTable/hooks/usePayoutsTable.tsx +++ b/src/packages/v4v5/components/PayoutsTable/hooks/usePayoutsTable.tsx @@ -1,7 +1,7 @@ import * as constants from '@ethersproject/constants' import { NULL_ALLOCATOR_ADDRESS } from 'constants/contracts/mainnet/Allocators' import { ONE_BILLION, WAD_DECIMALS } from 'constants/numbers' -import { SPLITS_TOTAL_PERCENT, JBSplit as Split, SplitPortion } from 'juice-sdk-core' +import { SPLITS_TOTAL_PERCENT, JBSplit as Split, SplitPortion } from '@bananapus/nana-sdk-core' import isEqual from 'lodash/isEqual' import round from 'lodash/round' import { AddEditAllocationModalEntity } from 'packages/v4v5/components/Allocation/AddEditAllocationModal' diff --git a/src/packages/v4v5/components/ProjectDashboard/ProjectChainSelect.tsx b/src/packages/v4v5/components/ProjectDashboard/ProjectChainSelect.tsx index ae4842cee6..97059d8987 100644 --- a/src/packages/v4v5/components/ProjectDashboard/ProjectChainSelect.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/ProjectChainSelect.tsx @@ -1,5 +1,5 @@ import { DEFAULT_PROJECT_CHAIN_ID, NETWORKS } from 'constants/networks' -import { JBChainId, useSuckers } from 'juice-sdk-react' +import { JBChainId, useSuckers } from '@bananapus/nana-sdk-react' import { JuiceListbox } from 'components/inputs/JuiceListbox' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/FirstCycleCountdownCallout.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/FirstCycleCountdownCallout.tsx index 6a0f0dde7f..37901b8eed 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/FirstCycleCountdownCallout.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/FirstCycleCountdownCallout.tsx @@ -1,4 +1,4 @@ -import { useJBProjectId, useJBUpcomingRuleset } from 'juice-sdk-react' +import { useJBProjectId, useJBUpcomingRuleset } from '@bananapus/nana-sdk-react' import { ClockIcon } from '@heroicons/react/24/outline' import { Trans } from '@lingui/macro' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayConfiguration.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayConfiguration.tsx index dde241af59..fb09c6c432 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayConfiguration.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayConfiguration.tsx @@ -1,7 +1,7 @@ import { Button, Tooltip } from 'antd' import { Trans, t } from '@lingui/macro' import { useCallback, useEffect, useMemo, useState } from 'react' -import { useJBChainId, useJBProjectId, useJBRuleset, useJBTokenContext } from 'juice-sdk-react' +import { useJBChainId, useJBProjectId, useJBRuleset, useJBTokenContext } from '@bananapus/nana-sdk-react' import { useProjectDispatch, useProjectSelector, useProjectStore } from '../redux/hooks' import { EthereumLogo } from './EthereumLogo' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/PayProjectModal.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/PayProjectModal.tsx index f62d319413..3bc10fceaf 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/PayProjectModal.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/PayProjectModal.tsx @@ -1,4 +1,4 @@ -import { JBChainId, useJBChainId } from 'juice-sdk-react' +import { JBChainId, useJBChainId } from '@bananapus/nana-sdk-react' import { PayProjectModalFormValues, usePayProjectModal, @@ -21,7 +21,7 @@ import { payRedeemActions } from '../../redux/payRedeemSlice' import { twMerge } from 'tailwind-merge' import { usePayAmounts } from './hooks/usePayAmounts' import { useProjectIsOFACListed } from 'hooks/useProjectIsOFACListed' -import { useSuckers } from 'juice-sdk-react' +import { useSuckers } from '@bananapus/nana-sdk-react' import { useV4V5UserNftCredits } from 'packages/v4v5/contexts/V4V5UserNftCreditsProvider' import { useWallet } from 'hooks/Wallet' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/components/EditRewardBeneficiary.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/components/EditRewardBeneficiary.tsx index 031c698c5a..d28ba61ebd 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/components/EditRewardBeneficiary.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/components/EditRewardBeneficiary.tsx @@ -4,7 +4,7 @@ import { Trans } from '@lingui/macro' import { Tooltip } from 'antd' import EthereumAddress from 'components/EthereumAddress' import Loading from 'components/Loading' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { useEffect, useRef } from 'react' import { twMerge } from 'tailwind-merge' import { useChainId } from 'wagmi' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectModal.ts b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectModal.ts index c8a41a2b13..e60a8e273e 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectModal.ts +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectModal.ts @@ -12,7 +12,7 @@ import { useProjectMetadataContext } from 'contexts/ProjectMetadataContext' import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' import { useCurrencyConverter } from 'hooks/useCurrencyConverter' import { useWallet } from 'hooks/Wallet' -import { NATIVE_TOKEN_DECIMALS } from 'juice-sdk-core' +import { NATIVE_TOKEN_DECIMALS } from '@bananapus/nana-sdk-core' import { TxStatus } from 'models/transaction' import { projectCartActions } from 'packages/v4v5/components/ProjectDashboard/redux/projectCartSlice' import { formatCurrencyAmount } from 'packages/v4v5/utils/formatCurrencyAmount' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectTx.ts b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectTx.ts index 4031477831..d3123ac0d4 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectTx.ts +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/usePayProjectModal/usePayProjectTx.ts @@ -5,14 +5,14 @@ import { jbMultiTerminalAbi, jbContractAddress, JBCoreContracts, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { JBChainId, useJBProjectId, useJBRulesetContext, usePreparePayMetadata, useSuckers, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useCallback, useContext, useMemo } from 'react' import { Address, Hash, parseEther, zeroAddress } from 'viem' import { useWriteContract } from 'wagmi' @@ -65,7 +65,7 @@ export const usePayProjectTx = ({ const { data: suckers } = useSuckers() const { projectId } = useJBProjectId() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { receivedTickets } = useProjectPaymentTokens() // TODO: is this needed for preferClaimedTokens? diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/useProjectPaymentTokens.ts b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/useProjectPaymentTokens.ts index 1e1498b7fb..069d35f2b1 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/useProjectPaymentTokens.ts +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/PayProjectModal/hooks/useProjectPaymentTokens.ts @@ -1,10 +1,10 @@ -import { ETH_CURRENCY_ID, NATIVE_TOKEN_DECIMALS, getTokenAToBQuote } from 'juice-sdk-core' +import { ETH_CURRENCY_ID, NATIVE_TOKEN_DECIMALS, getTokenAToBQuote } from '@bananapus/nana-sdk-core' import { fromWad, parseWad } from 'utils/format/formatNumber' import { useJBRulesetContext, useJBTokenContext, useNativeTokenSymbol, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { FixedInt } from 'fpnum' import { formatUnits } from 'viem' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/RedeemConfiguration.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/RedeemConfiguration.tsx index 07f8557b94..65864d1fa8 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/RedeemConfiguration.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/RedeemConfiguration.tsx @@ -1,5 +1,5 @@ import { Button, Tooltip } from 'antd' -import { JB_TOKEN_DECIMALS, NATIVE_TOKEN, jbMultiTerminalAbi } from 'juice-sdk-core' +import { JB_TOKEN_DECIMALS, NATIVE_TOKEN, jbMultiTerminalAbi } from '@bananapus/nana-sdk-core' import { JuiceModal, JuiceModalProps } from 'components/modals/JuiceModal' import { Trans, t } from '@lingui/macro' import { formatEther, parseUnits } from 'viem' @@ -9,7 +9,7 @@ import { useJBContractContext, useJBProjectId, useJBTokenContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useWriteContract } from 'wagmi' import { CheckCircleIcon } from '@heroicons/react/24/outline' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5NftCreditsCallouts.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5NftCreditsCallouts.tsx index 2482556f26..e8220d1a4d 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5NftCreditsCallouts.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5NftCreditsCallouts.tsx @@ -1,7 +1,7 @@ import { CubeIcon } from '@heroicons/react/24/outline' import { Trans } from '@lingui/macro' import { Button } from 'antd' -import { formatEther } from 'juice-sdk-core' +import { formatEther } from '@bananapus/nana-sdk-core' import { useV4V5UserNftCredits } from 'packages/v4v5/contexts/V4V5UserNftCreditsProvider' import { useProjectPageQueries } from 'packages/v4v5/views/V4V5ProjectDashboard/hooks/useProjectPageQueries' diff --git a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5PayRedeemCard.tsx b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5PayRedeemCard.tsx index cd156da251..33c2328b14 100644 --- a/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5PayRedeemCard.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/V4V5PayRedeemCard/V4V5PayRedeemCard.tsx @@ -5,8 +5,8 @@ import { useJBRulesetContext, useJBContractContext, useSuckers, -} from 'juice-sdk-react' -import { jbTokensAbi, JBCoreContracts } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbTokensAbi, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import React, { ReactNode } from 'react' import { useProjectDispatch, useProjectSelector } from '../redux/hooks' @@ -15,7 +15,7 @@ import { InformationCircleIcon } from '@heroicons/react/24/outline' import { Tooltip } from 'antd' import { Callout } from 'components/Callout/Callout' import { useWallet } from 'hooks/Wallet' -import { JB_TOKEN_DECIMALS } from 'juice-sdk-core' +import { JB_TOKEN_DECIMALS } from '@bananapus/nana-sdk-core' import { useV4V5NftRewards } from 'packages/v4v5/contexts/V4V5NftRewards/V4V5NftRewardsProvider' import { usePayoutLimit } from 'packages/v4v5/hooks/usePayoutLimit' import { useProjectHasErc20Token } from 'packages/v4v5/hooks/useProjectHasErc20Token' diff --git a/src/packages/v4v5/components/ProjectDashboard/components/ProjectHeaderPopupMenu.tsx b/src/packages/v4v5/components/ProjectDashboard/components/ProjectHeaderPopupMenu.tsx index 8aea1d5586..864496744d 100644 --- a/src/packages/v4v5/components/ProjectDashboard/components/ProjectHeaderPopupMenu.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/components/ProjectHeaderPopupMenu.tsx @@ -7,7 +7,7 @@ import { SocialLinkButton } from 'components/Project/ProjectHeader/SocialLinkBut import { useSocialLinks } from 'components/Project/ProjectHeader/hooks/useSocialLinks' import { PopupMenu } from 'components/ui/PopupMenu' import useMobile from 'hooks/useMobile' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { useV4V5WalletHasPermission } from 'packages/v4v5/hooks/useV4V5WalletHasPermission' import { V4V5OperatorPermission } from 'packages/v4v5/models/v4Permissions' import { settingsPagePath } from 'packages/v4v5/utils/routes' diff --git a/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/SuccessPayView.tsx b/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/SuccessPayView.tsx index d531ad8c50..9bd65e58df 100644 --- a/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/SuccessPayView.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/SuccessPayView.tsx @@ -1,7 +1,7 @@ import { ArrowUturnLeftIcon } from '@heroicons/react/24/outline' import { Trans } from '@lingui/macro' import { Button } from 'antd' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import dynamic from 'next/dynamic' import Link from 'next/link' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/components/SuccessPayCard.tsx b/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/components/SuccessPayCard.tsx index 4061b56fae..e3068a4a59 100644 --- a/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/components/SuccessPayCard.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/components/SuccessPayView/components/SuccessPayCard.tsx @@ -4,7 +4,7 @@ import EtherscanLink from 'components/EtherscanLink' import { ProjectHeaderLogo } from 'components/Project/ProjectHeader/ProjectHeaderLogo' import { useProjectMetadataContext } from 'contexts/ProjectMetadataContext' import useMobile from 'hooks/useMobile' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import moment from 'moment' import { formatCurrencyAmount } from 'packages/v4v5/utils/formatCurrencyAmount' import { useProjectPageQueries } from 'packages/v4v5/views/V4V5ProjectDashboard/hooks/useProjectPageQueries' diff --git a/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/AddToProjectBalanceForm.tsx b/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/AddToProjectBalanceForm.tsx index c07f3d0302..3c488b0181 100644 --- a/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/AddToProjectBalanceForm.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/AddToProjectBalanceForm.tsx @@ -1,5 +1,5 @@ -import { JBChainId, NATIVE_TOKEN, jbMultiTerminalAbi } from 'juice-sdk-core' -import { useJBChainId, useJBContractContext, useJBProjectId, useSuckers } from 'juice-sdk-react' +import { JBChainId, NATIVE_TOKEN, jbMultiTerminalAbi } from '@bananapus/nana-sdk-core' +import { useJBChainId, useJBContractContext, useJBProjectId, useSuckers } from '@bananapus/nana-sdk-react' import { useContext, useState } from 'react' import { useWriteContract } from 'wagmi' import { emitErrorNotification, emitInfoNotification } from 'utils/notifications' diff --git a/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/PaymentAddressSection/LaunchProjectPayerModal/LaunchProjectPayerModal.tsx b/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/PaymentAddressSection/LaunchProjectPayerModal/LaunchProjectPayerModal.tsx index eabac3e15b..3fe1852e6a 100644 --- a/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/PaymentAddressSection/LaunchProjectPayerModal/LaunchProjectPayerModal.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/PaymentAddressSection/LaunchProjectPayerModal/LaunchProjectPayerModal.tsx @@ -8,7 +8,7 @@ import { Callout } from 'components/Callout/Callout' import EtherscanLink from 'components/EtherscanLink' import TransactionModal from 'components/modals/TransactionModal' import { PROJECT_PAYER_ADDRESS_EXPLANATION } from 'components/strings' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { useState } from 'react' import { useChainId } from 'wagmi' import AdvancedOptionsCollapse from './AdvancedOptionsCollapse' diff --git a/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/V4V5ProjectToolsDrawer.tsx b/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/V4V5ProjectToolsDrawer.tsx index e6ebc32afd..f90de41580 100644 --- a/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/V4V5ProjectToolsDrawer.tsx +++ b/src/packages/v4v5/components/ProjectDashboard/components/V4V5ProjectToolsDrawer/V4V5ProjectToolsDrawer.tsx @@ -2,7 +2,7 @@ import { Divider, Drawer } from 'antd' import { Trans } from '@lingui/macro' import useMobile from 'hooks/useMobile' -import { useJBProjectMetadataContext } from 'juice-sdk-react' +import { useJBProjectMetadataContext } from '@bananapus/nana-sdk-react' import { AddToProjectBalanceForm } from './AddToProjectBalanceForm' export function V4V5ProjectToolsDrawer({ diff --git a/src/packages/v4v5/components/ProjectDashboard/redux/payRedeemSlice.ts b/src/packages/v4v5/components/ProjectDashboard/redux/payRedeemSlice.ts index 48d60e78f9..5d11f84646 100644 --- a/src/packages/v4v5/components/ProjectDashboard/redux/payRedeemSlice.ts +++ b/src/packages/v4v5/components/ProjectDashboard/redux/payRedeemSlice.ts @@ -1,5 +1,5 @@ import { createSlice } from '@reduxjs/toolkit' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' export type PayRedeemState = { cardState: 'pay' | 'redeem' diff --git a/src/packages/v4v5/components/QueueSafeEditRulesetTxsModal/QueueSafeEditRulesetTxsModal.tsx b/src/packages/v4v5/components/QueueSafeEditRulesetTxsModal/QueueSafeEditRulesetTxsModal.tsx index a75d80504c..b33ea89c7f 100644 --- a/src/packages/v4v5/components/QueueSafeEditRulesetTxsModal/QueueSafeEditRulesetTxsModal.tsx +++ b/src/packages/v4v5/components/QueueSafeEditRulesetTxsModal/QueueSafeEditRulesetTxsModal.tsx @@ -1,14 +1,14 @@ import { Trans } from '@lingui/macro' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { useCallback } from 'react' import { SafeProposeTransactionResponse, useProposeSafeTransaction } from '../../hooks/useProposeSafeTransaction' import { EditCycleFormFields } from '../../views/V4V5ProjectSettings/EditCyclePage/EditCycleFormFields' import QueueSafeTxsModal from '../QueueSafeTxsModal' -import { useJBContractContext, useSuckers } from 'juice-sdk-react' +import { useJBContractContext, useSuckers } from '@bananapus/nana-sdk-react' import { useContext } from 'react' -import { JBRulesetContext } from 'juice-sdk-react' +import { JBRulesetContext } from '@bananapus/nana-sdk-react' import { useV4V5Version } from '../../contexts/V4V5VersionProvider' -import { NATIVE_TOKEN, jbContractAddress, JBCoreContracts, jbController4_1Abi, jbControllerAbi } from 'juice-sdk-core' +import { NATIVE_TOKEN, jbContractAddress, JBCoreContracts, jbController4_1Abi, jbControllerAbi, jbControllerV5Abi } from '@bananapus/nana-sdk-core' import { transformEditCycleFormFieldsToTxArgs } from '../../utils/editRuleset' import { encodeFunctionData } from 'viem' @@ -65,7 +65,14 @@ export default function QueueSafeEditRulesetTxsModal({ const projectControllerAddress = contracts.controller.data let data: `0x${string}` - if (version === 4 && projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId]) { + if (version === 6) { + // Use v6 controller ABI (reads the scopeCashOutsToLocalBalances metadata flag) + data = encodeFunctionData({ + abi: jbControllerAbi, + functionName: 'queueRulesetsOf', + args, + }) + } else if (version === 4 && projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId]) { // Use v4.1 controller ABI data = encodeFunctionData({ abi: jbController4_1Abi, @@ -73,9 +80,9 @@ export default function QueueSafeEditRulesetTxsModal({ args, }) } else { - // Use v4 controller ABI + // Use v4/v5 controller ABI (reads the useTotalSurplusForCashOuts metadata flag) data = encodeFunctionData({ - abi: jbControllerAbi, + abi: jbControllerV5Abi, functionName: 'queueRulesetsOf', args, }) diff --git a/src/packages/v4v5/components/QueueSafeTransferOwnershipTxsModal/QueueSafeTransferOwnershipTxsModal.tsx b/src/packages/v4v5/components/QueueSafeTransferOwnershipTxsModal/QueueSafeTransferOwnershipTxsModal.tsx index 56aebf1fc4..3faa915538 100644 --- a/src/packages/v4v5/components/QueueSafeTransferOwnershipTxsModal/QueueSafeTransferOwnershipTxsModal.tsx +++ b/src/packages/v4v5/components/QueueSafeTransferOwnershipTxsModal/QueueSafeTransferOwnershipTxsModal.tsx @@ -1,5 +1,5 @@ import { Trans } from '@lingui/macro' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { useCallback } from 'react' import { Address } from 'viem' import { SafeProposeTransactionResponse } from '../../hooks/useProposeSafeTransaction' diff --git a/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeLaunchProjectTxsModal.tsx b/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeLaunchProjectTxsModal.tsx index d42c522c4c..dcf6290b79 100644 --- a/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeLaunchProjectTxsModal.tsx +++ b/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeLaunchProjectTxsModal.tsx @@ -2,7 +2,7 @@ import { SafeLaunchProjectData, useProposeSafeLaunchProjectTx } from 'packages/v import { useCallback, useMemo } from 'react' import { Trans } from '@lingui/macro' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { SafeProposeTransactionResponse } from 'packages/v4v5/hooks/useProposeSafeTransaction' import QueueSafeTxsModal from './QueueSafeTxsModal' diff --git a/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeTxsModal.tsx b/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeTxsModal.tsx index 1eb20c6641..37fe01739d 100644 --- a/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeTxsModal.tsx +++ b/src/packages/v4v5/components/QueueSafeTxsModal/QueueSafeTxsModal.tsx @@ -1,5 +1,5 @@ import { Button, Modal, Spin, Tooltip } from 'antd' -import { JBChainId, useSuckers } from 'juice-sdk-react' +import { JBChainId, useSuckers } from '@bananapus/nana-sdk-react' import { useCallback, useEffect, useMemo, useState } from 'react' import { emitErrorNotification, emitInfoNotification } from 'utils/notifications' import { ApiFilled } from '@ant-design/icons' diff --git a/src/packages/v4v5/components/QueueTransferOwnershipTxsModal/QueueTransferOwnershipTxsModal.tsx b/src/packages/v4v5/components/QueueTransferOwnershipTxsModal/QueueTransferOwnershipTxsModal.tsx index d450204a7c..5a1d4b2205 100644 --- a/src/packages/v4v5/components/QueueTransferOwnershipTxsModal/QueueTransferOwnershipTxsModal.tsx +++ b/src/packages/v4v5/components/QueueTransferOwnershipTxsModal/QueueTransferOwnershipTxsModal.tsx @@ -1,5 +1,5 @@ import { Button, Modal, Spin, Tooltip } from 'antd' -import { JBChainId, useSuckers } from 'juice-sdk-react' +import { JBChainId, useSuckers } from '@bananapus/nana-sdk-react' import { useCallback, useEffect, useMemo, useState } from 'react' import { emitErrorNotification, emitInfoNotification } from 'utils/notifications' diff --git a/src/packages/v4v5/components/ReservedTokensList.tsx b/src/packages/v4v5/components/ReservedTokensList.tsx index b175d14ff0..93f311ad61 100644 --- a/src/packages/v4v5/components/ReservedTokensList.tsx +++ b/src/packages/v4v5/components/ReservedTokensList.tsx @@ -3,7 +3,7 @@ import { t } from '@lingui/macro' import { Button } from 'antd' import { FormItemInput } from 'models/formItemInput' -import { SPLITS_TOTAL_PERCENT } from 'juice-sdk-core' +import { SPLITS_TOTAL_PERCENT } from '@bananapus/nana-sdk-core' import { useMemo } from 'react' import { totalSplitsPercent } from '../utils/v4Splits' import { Allocation, AllocationSplit } from './Allocation/Allocation' diff --git a/src/packages/v4v5/components/SplitList/SplitItem/JuiceboxProjectBeneficiary.tsx b/src/packages/v4v5/components/SplitList/SplitItem/JuiceboxProjectBeneficiary.tsx index 6a72f702ce..3b8ab85de2 100644 --- a/src/packages/v4v5/components/SplitList/SplitItem/JuiceboxProjectBeneficiary.tsx +++ b/src/packages/v4v5/components/SplitList/SplitItem/JuiceboxProjectBeneficiary.tsx @@ -2,7 +2,7 @@ import { Trans } from '@lingui/macro' import { Tooltip } from 'antd' import { AllocatorBadge } from 'components/AllocatorBadge' import { NULL_ALLOCATOR_ADDRESS } from 'constants/contracts/mainnet/Allocators' -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' import { useChainId } from 'wagmi' import V4V5ProjectHandleLink from '../../V4V5ProjectHandleLink' export function JuiceboxProjectBeneficiary({ diff --git a/src/packages/v4v5/components/SplitList/SplitItem/ReservedTokensValue.tsx b/src/packages/v4v5/components/SplitList/SplitItem/ReservedTokensValue.tsx index efa8838671..bdc91cdfd4 100644 --- a/src/packages/v4v5/components/SplitList/SplitItem/ReservedTokensValue.tsx +++ b/src/packages/v4v5/components/SplitList/SplitItem/ReservedTokensValue.tsx @@ -1,6 +1,6 @@ import { Trans } from '@lingui/macro' import TooltipIcon from 'components/TooltipIcon' -import { SplitPortion } from 'juice-sdk-core' +import { SplitPortion } from '@bananapus/nana-sdk-core' export function ReservedTokensValue({ splitPercent, diff --git a/src/packages/v4v5/components/SplitList/SplitItem/SplitAmountValue.tsx b/src/packages/v4v5/components/SplitList/SplitItem/SplitAmountValue.tsx index b1d9f5108a..cd2f546ed1 100644 --- a/src/packages/v4v5/components/SplitList/SplitItem/SplitAmountValue.tsx +++ b/src/packages/v4v5/components/SplitList/SplitItem/SplitAmountValue.tsx @@ -2,8 +2,9 @@ import { CurrencyDollarIcon } from '@heroicons/react/24/outline' import { Trans } from '@lingui/macro' import { Tooltip } from 'antd' import { CurrencyName } from 'constants/currency' -import { SPLITS_TOTAL_PERCENT, jbMultiTerminalAbi, JBCoreContracts } from 'juice-sdk-core' -import { NativeTokenValue, useJBContractContext } from 'juice-sdk-react' +import { SPLITS_TOTAL_PERCENT } from '@bananapus/nana-sdk-core' +import { useTerminalFee } from 'packages/v4v5/hooks/useTerminalFee' +import { NativeTokenValue, useJBContractContext } from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { V4V5CurrencyOption } from 'packages/v4v5/models/v4CurrencyOption' import { V4V5CurrencyName } from 'packages/v4v5/utils/currency' @@ -20,11 +21,7 @@ export function SplitAmountValue({ hideTooltip?: boolean }) { const { contractAddress } = useJBContractContext() - const { data: primaryNativeTerminalFee } = useReadContract({ - abi: jbMultiTerminalAbi, - address: contractAddress(JBCoreContracts.JBMultiTerminal), - functionName: 'FEE', - }) + const primaryNativeTerminalFee = useTerminalFee() const splitValue = props.totalValue ? (props.totalValue * props.split.percent.value) / diff --git a/src/packages/v4v5/components/SplitList/SplitItem/SplitItem.tsx b/src/packages/v4v5/components/SplitList/SplitItem/SplitItem.tsx index e45302a2d3..65c520ee42 100644 --- a/src/packages/v4v5/components/SplitList/SplitItem/SplitItem.tsx +++ b/src/packages/v4v5/components/SplitList/SplitItem/SplitItem.tsx @@ -1,4 +1,4 @@ -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' import { isJuiceboxProjectSplit } from 'packages/v4v5/utils/v4Splits' import { ETHAddressBeneficiary } from './EthAddressBeneficiary' import { JuiceboxProjectBeneficiary } from './JuiceboxProjectBeneficiary' diff --git a/src/packages/v4v5/components/SplitList/SplitItem/SplitPercentValue.tsx b/src/packages/v4v5/components/SplitList/SplitItem/SplitPercentValue.tsx index 8d8d603479..6d513dc236 100644 --- a/src/packages/v4v5/components/SplitList/SplitItem/SplitPercentValue.tsx +++ b/src/packages/v4v5/components/SplitList/SplitItem/SplitPercentValue.tsx @@ -1,4 +1,4 @@ -import { SplitPortion } from 'juice-sdk-core' +import { SplitPortion } from '@bananapus/nana-sdk-core' export function SplitPercentValue({ percent }: { percent: SplitPortion }) { const formattedPercent = percent.formatPercentage() diff --git a/src/packages/v4v5/components/SplitList/SplitList.tsx b/src/packages/v4v5/components/SplitList/SplitList.tsx index 793bf83725..e5577bd4f7 100644 --- a/src/packages/v4v5/components/SplitList/SplitList.tsx +++ b/src/packages/v4v5/components/SplitList/SplitList.tsx @@ -1,4 +1,4 @@ -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' import { sortSplits, v4GetProjectOwnerRemainderSplit, diff --git a/src/packages/v4v5/components/V4V5EditReservedTokens.tsx b/src/packages/v4v5/components/V4V5EditReservedTokens.tsx index c6270c7da6..30f65aadb0 100644 --- a/src/packages/v4v5/components/V4V5EditReservedTokens.tsx +++ b/src/packages/v4v5/components/V4V5EditReservedTokens.tsx @@ -1,6 +1,6 @@ import { Trans } from '@lingui/macro' import { Callout } from 'components/Callout/Callout' -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import { useCallback } from 'react' import { allocationToSplit, splitToAllocation } from '../utils/splitToAllocation' import { AllocationSplit } from './Allocation/Allocation' diff --git a/src/packages/v4v5/components/V4V5OmnichainTransferOwnershipForm.tsx b/src/packages/v4v5/components/V4V5OmnichainTransferOwnershipForm.tsx index dae24b84e4..9d95eab0ec 100644 --- a/src/packages/v4v5/components/V4V5OmnichainTransferOwnershipForm.tsx +++ b/src/packages/v4v5/components/V4V5OmnichainTransferOwnershipForm.tsx @@ -6,8 +6,8 @@ import { emitErrorNotification, emitInfoNotification } from 'utils/notifications import EthereumAddress from 'components/EthereumAddress' import { EthAddressInput } from 'components/inputs/EthAddressInput' import TransactionModal from 'components/modals/TransactionModal' -import { JBChainId } from 'juice-sdk-core' -import { useSuckers } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-core' +import { useSuckers } from '@bananapus/nana-sdk-react' import QueueTransferOwnershipTxsModal from 'packages/v4v5/components/QueueTransferOwnershipTxsModal' import { useTransferOwnershipOnChain } from 'packages/v4v5/hooks/useTransferOwnershipOnChain' import { useTransferProjectOwnershipTx } from 'packages/v4v5/hooks/useTransferProjectOwnershipTx' diff --git a/src/packages/v4v5/components/V4V5ProjectHandleLink.tsx b/src/packages/v4v5/components/V4V5ProjectHandleLink.tsx index 60c1359e7d..81437fee73 100644 --- a/src/packages/v4v5/components/V4V5ProjectHandleLink.tsx +++ b/src/packages/v4v5/components/V4V5ProjectHandleLink.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' import ProjectLogo from 'components/ProjectLogo' import { PV_V4 } from 'constants/pv' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import Link from 'next/link' import { twMerge } from 'tailwind-merge' import { useV4V5Version } from '../contexts/V4V5VersionProvider' diff --git a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/DownloadTokenHoldersModal.tsx b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/DownloadTokenHoldersModal.tsx index feacd3b83e..438951ac01 100644 --- a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/DownloadTokenHoldersModal.tsx +++ b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/DownloadTokenHoldersModal.tsx @@ -9,7 +9,7 @@ import { useProjectQuery, } from 'generated/v4v5/graphql' -import { useJBChainId, useJBContractContext } from 'juice-sdk-react' +import { useJBChainId, useJBContractContext } from '@bananapus/nana-sdk-react' import { bendystrawClient } from 'lib/apollo/bendystrawClient' import { bendystrawUri } from 'lib/apollo/bendystrawUri' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/HoldersList.tsx b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/HoldersList.tsx index 974b756eac..eab4da6ce1 100644 --- a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/HoldersList.tsx +++ b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/HoldersList.tsx @@ -11,8 +11,8 @@ import Loading from 'components/Loading' import { TokenAmount } from 'components/TokenAmount' import { JuiceListbox } from 'components/inputs/JuiceListbox' import { useParticipantsQuery, useProjectQuery } from 'generated/v4v5/graphql' -import { JBChainId } from 'juice-sdk-core' -import { NativeTokenValue, useJBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-core' +import { NativeTokenValue, useJBChainId } from '@bananapus/nana-sdk-react' import { bendystrawClient } from 'lib/apollo/bendystrawClient' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { useEffect, useState } from 'react' diff --git a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/TokenDistributionChart/TokenPieChart.tsx b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/TokenDistributionChart/TokenPieChart.tsx index a4714663b1..c7af4b7290 100644 --- a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/TokenDistributionChart/TokenPieChart.tsx +++ b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/TokenDistributionChart/TokenPieChart.tsx @@ -1,7 +1,7 @@ import { BigNumber } from '@ethersproject/bignumber' import EthereumAddress from 'components/EthereumAddress' import { ThemeContext } from 'contexts/Theme/ThemeContext' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import tailwind from 'lib/tailwind' import { ParticipantsQuery } from 'packages/v4v5/graphql/client/graphql' import { useContext, useEffect, useMemo, useState } from 'react' diff --git a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/V4V5TokenHoldersModal.tsx b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/V4V5TokenHoldersModal.tsx index 085810c71d..821d3734f9 100644 --- a/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/V4V5TokenHoldersModal.tsx +++ b/src/packages/v4v5/components/modals/V4V5TokenHoldersModal/V4V5TokenHoldersModal.tsx @@ -6,7 +6,7 @@ import { useJBChainId, useJBContractContext, useJBTokenContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { bendystrawClient } from 'lib/apollo/bendystrawClient' import { isZeroAddress } from 'utils/address' import { tokenSymbolText } from 'utils/tokenSymbolText' diff --git a/src/packages/v4v5/contexts/RulesetCountdownProvider.tsx b/src/packages/v4v5/contexts/RulesetCountdownProvider.tsx index a8c153bce7..a37d12b36a 100644 --- a/src/packages/v4v5/contexts/RulesetCountdownProvider.tsx +++ b/src/packages/v4v5/contexts/RulesetCountdownProvider.tsx @@ -1,5 +1,5 @@ import { useCountdownClock } from 'components/Project/hooks/useCountdownClock' -import { useJBProjectId, useJBRuleset } from 'juice-sdk-react' +import { useJBProjectId, useJBRuleset } from '@bananapus/nana-sdk-react' import { createContext } from 'react' type RulesetCountdownContextType = { diff --git a/src/packages/v4v5/contexts/V4V5NftRewards/V4V5NftRewardsProvider.tsx b/src/packages/v4v5/contexts/V4V5NftRewards/V4V5NftRewardsProvider.tsx index 4fa920bcbf..75d8d172de 100644 --- a/src/packages/v4v5/contexts/V4V5NftRewards/V4V5NftRewardsProvider.tsx +++ b/src/packages/v4v5/contexts/V4V5NftRewards/V4V5NftRewardsProvider.tsx @@ -3,14 +3,19 @@ import { useJBRulesetContext, useJBUpcomingRuleset, useSuckers, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { - jb721TiersHookStoreAbi, + RevnetCoreContracts, + getJBContractAddress, jb721TiersHookAbi, + jb721TiersHookStoreAbi, + jb721TiersHookStoreV5Abi, + jbContractAddress, jbOmnichainDeployerAbi, - revDeployerAbi, - getJBContractAddress, -} from 'juice-sdk-core' + jbOmnichainDeployerV5Abi, + revDeployerV5Abi, + revOwnerAbi, +} from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import React, { createContext } from 'react' @@ -31,10 +36,11 @@ const NFT_PAGE_SIZE = 100n /** * Type for individual NFT tier data returned from the 721 Hook Store. - * Inferred from the tiersOf function return type in the ABI. + * Uses the v4/v5 tier shape (flat flag booleans, `encodedIPFSUri`); v6 store + * responses are normalized to this shape before being handed to consumers. */ export type JB721TierV4 = ContractFunctionReturnType< - typeof jb721TiersHookStoreAbi, + typeof jb721TiersHookStoreV5Abi, 'view', 'tiersOf' >[0] @@ -57,12 +63,14 @@ export const V4V5NftRewardsContext = createContext({ }) /** - * Provides NFT rewards data for V4/V5 projects. + * Provides NFT rewards data for V4/V5/V6 projects. * * Handles three patterns of NFT hook storage: * 1. Direct 721 Hook - dataHook points directly to the 721 Hook contract * 2. Omnichain Deployer - dataHook points to deployer, which stores the real hook - * 3. Revnet Deployer - dataHook points to revnet deployer, which stores the real hook + * (v4/v5 expose it via dataHookOf, v6 via tiered721HookOf) + * 3. Revnet - dataHook points to the revnet deployer (v4/v5, which stores the + * real hook) or the REVOwner contract (v6, which stores it instead) * * The resolver logic detects which pattern is being used and fetches the actual * 721 Hook address before loading NFT tier data. @@ -89,16 +97,27 @@ export const V4V5NftRewardsProvider: React.FC< const revDeployerAddress = chainId ? getJBContractAddress('REVDeployer', version, chainId)?.toLowerCase() : undefined + // v6 revnets keep their 721 hook on the REVOwner contract (same address on all chains) + const revOwnerAddress = + version === 6 && chainId + ? jbContractAddress['6'][RevnetCoreContracts.REVOwner][chainId] + : undefined const isOmnichainDeployer = dataHookAddress?.toLowerCase() === omnichainDeployerAddress - const isRevnetDeployer = - dataHookAddress?.toLowerCase() === revDeployerAddress + const isRevnetProject = + dataHookAddress?.toLowerCase() === revDeployerAddress || + (!!revOwnerAddress && + dataHookAddress?.toLowerCase() === revOwnerAddress.toLowerCase()) - // Resolve the actual 721 Hook address from deployer contracts + // Resolve the actual 721 Hook address from deployer contracts. + // v4/v5 deployers expose dataHookOf(projectId, rulesetId) returning + // (useDataHookForPay, useDataHookForCashout, dataHook); the v6 deployer + // replaced it with tiered721HookOf(projectId, rulesetId) returning + // (hook, useDataHookForCashOut). const currentRulesetId = jbRuleSet.ruleset.data?.id - const omnichainHook = useReadContract({ - abi: jbOmnichainDeployerAbi, + const omnichainHookV5 = useReadContract({ + abi: jbOmnichainDeployerV5Abi, address: dataHookAddress, functionName: 'dataHookOf', args: @@ -107,24 +126,58 @@ export const V4V5NftRewardsProvider: React.FC< : undefined, chainId, query: { - enabled: isOmnichainDeployer && !!projectId && !!currentRulesetId, + enabled: + version !== 6 && + isOmnichainDeployer && + !!projectId && + !!currentRulesetId, + }, + }) + const omnichainHookV6 = useReadContract({ + abi: jbOmnichainDeployerAbi, + address: dataHookAddress, + functionName: 'tiered721HookOf', + args: + projectId && currentRulesetId + ? [projectId, BigInt(currentRulesetId)] + : undefined, + chainId, + query: { + enabled: + version === 6 && + isOmnichainDeployer && + !!projectId && + !!currentRulesetId, }, }) + const omnichainHookAddress = + version === 6 ? omnichainHookV6.data?.[0] : omnichainHookV5.data?.[2] - const revnetHook = useReadContract({ - abi: revDeployerAbi, + const revnetHookV5 = useReadContract({ + abi: revDeployerV5Abi, address: dataHookAddress, functionName: 'tiered721HookOf', args: projectId ? [projectId] : undefined, chainId, query: { - enabled: isRevnetDeployer && !!projectId, + enabled: version !== 6 && isRevnetProject && !!projectId, }, }) + const revnetHookV6 = useReadContract({ + abi: revOwnerAbi, + address: revOwnerAddress, + functionName: 'tiered721HookOf', + args: projectId ? [projectId] : undefined, + chainId, + query: { + enabled: version === 6 && isRevnetProject && !!projectId, + }, + }) + const revnetHookAddress = version === 6 ? revnetHookV6.data : revnetHookV5.data // Use resolved hook address if available, otherwise use original dataHook - const resolved721HookAddress = (omnichainHook.data || - revnetHook.data || + const resolved721HookAddress = (omnichainHookAddress || + revnetHookAddress || dataHookAddress) as `0x${string}` | undefined // Load NFT tier data from the 721 Hook and its store @@ -139,7 +192,24 @@ export const V4V5NftRewardsProvider: React.FC< suckers?.map(s => s.peerChainId).filter(id => id !== undefined) || (chainId ? [chainId] : []) - const tiersOf = useReadContract({ + // The v6 store returns a different tier shape (nested flags tuple, + // splitPercent, `encodedIpfsUri` casing), so read with the matching ABI + // per version and normalize v6 tiers to the v4/v5 shape below. + const tiersOfV5 = useReadContract({ + abi: jb721TiersHookStoreV5Abi, + address: storeAddress.data, + functionName: 'tiersOf', + args: [ + resolved721HookAddress ?? zeroAddress, + [], + false, + 0n, + NFT_PAGE_SIZE, + ], + chainId, + query: { enabled: version !== 6 }, + }) + const tiersOfV6 = useReadContract({ abi: jb721TiersHookStoreAbi, address: storeAddress.data, functionName: 'tiersOf', @@ -151,19 +221,42 @@ export const V4V5NftRewardsProvider: React.FC< NFT_PAGE_SIZE, ], chainId, + query: { enabled: version === 6 }, }) + const tiersData: readonly JB721TierV4[] | undefined = React.useMemo(() => { + if (version !== 6) return tiersOfV5.data + return tiersOfV6.data?.map(tier => ({ + id: tier.id, + price: tier.price, + remainingSupply: tier.remainingSupply, + initialSupply: tier.initialSupply, + votingUnits: tier.votingUnits, + reserveFrequency: tier.reserveFrequency, + reserveBeneficiary: tier.reserveBeneficiary, + encodedIPFSUri: tier.encodedIpfsUri, + category: tier.category, + discountPercent: tier.discountPercent, + allowOwnerMint: tier.flags.allowOwnerMint, + transfersPausable: tier.flags.transfersPausable, + cannotBeRemoved: tier.flags.cantBeRemoved, + cannotIncreaseDiscountPercent: tier.flags.cantIncreaseDiscountPercent, + resolvedUri: tier.resolvedUri, + })) + }, [version, tiersOfV5.data, tiersOfV6.data]) + const { data: loadedRewardTiers, isLoading: nftRewardTiersLoading } = useNftRewards( - tiersOf.data ?? [], + tiersData ?? [], projectChains, projectId, chainId, storeAddress.data as `0x${string}` | undefined, resolved721HookAddress, + version, ) - const loadedCIDs = CIDsOfNftRewardTiersResponse(tiersOf.data ?? []) + const loadedCIDs = CIDsOfNftRewardTiersResponse(tiersData ?? []) const p = useReadContract({ abi: jb721TiersHookAbi, @@ -173,13 +266,25 @@ export const V4V5NftRewardsProvider: React.FC< }) const currency = Number(p.data ? p.data[0] : 0) as V2V3CurrencyOption - const flags = useReadContract({ + // v6 flagsOf returns an extra flag (issueTokensForSplits), which changes the + // encoded response size, so the versioned ABI is required to decode. + const flagsV5 = useReadContract({ + abi: jb721TiersHookStoreV5Abi, + address: storeAddress.data, + functionName: 'flagsOf', + args: [resolved721HookAddress ?? zeroAddress], + chainId, + query: { enabled: version !== 6 }, + }) + const flagsV6 = useReadContract({ abi: jb721TiersHookStoreAbi, address: storeAddress.data, functionName: 'flagsOf', args: [resolved721HookAddress ?? zeroAddress], chainId, + query: { enabled: version === 6 }, }) + const flagsData = version === 6 ? flagsV6.data : flagsV5.data const { data: collectionMetadataUri } = useReadContract({ abi: jb721TiersHookAbi, @@ -190,21 +295,29 @@ export const V4V5NftRewardsProvider: React.FC< const loading = React.useMemo( () => - omnichainHook.isLoading || - revnetHook.isLoading || + omnichainHookV5.isLoading || + omnichainHookV6.isLoading || + revnetHookV5.isLoading || + revnetHookV6.isLoading || storeAddress.isLoading || - tiersOf.isLoading || + tiersOfV5.isLoading || + tiersOfV6.isLoading || nftRewardTiersLoading || p.isLoading || - flags.isLoading, + flagsV5.isLoading || + flagsV6.isLoading, [ - omnichainHook.isLoading, - revnetHook.isLoading, + omnichainHookV5.isLoading, + omnichainHookV6.isLoading, + revnetHookV5.isLoading, + revnetHookV6.isLoading, storeAddress.isLoading, - tiersOf.isLoading, + tiersOfV5.isLoading, + tiersOfV6.isLoading, nftRewardTiersLoading, p.isLoading, - flags.isLoading, + flagsV5.isLoading, + flagsV6.isLoading, ], ) @@ -218,7 +331,7 @@ export const V4V5NftRewardsProvider: React.FC< ...EMPTY_NFT_COLLECTION_METADATA, uri: collectionMetadataUri, }, - flags: flags.data ?? DEFAULT_NFT_FLAGS_V4, + flags: flagsData ?? DEFAULT_NFT_FLAGS_V4, }, loading, } diff --git a/src/packages/v4v5/contexts/V4V5NftRewards/useNftRewards.ts b/src/packages/v4v5/contexts/V4V5NftRewards/useNftRewards.ts index 028d84ea9e..08a699ff7e 100644 --- a/src/packages/v4v5/contexts/V4V5NftRewards/useNftRewards.ts +++ b/src/packages/v4v5/contexts/V4V5NftRewards/useNftRewards.ts @@ -1,5 +1,5 @@ import { UseQueryResult, useQuery } from '@tanstack/react-query' -import { formatEther, jb721TiersHookStoreAbi } from 'juice-sdk-core' +import { JBVersion, formatEther, jb721TiersHookStoreAbi, jb721TiersHookStoreV5Abi } from '@bananapus/nana-sdk-core' import { readContract } from 'wagmi/actions' import { IPFSNftRewardTier, NftRewardTier } from 'models/nftRewards' import { @@ -12,7 +12,7 @@ import { } from 'utils/ipfs' import axios from 'axios' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { withHttps } from 'utils/externalLink' import { zeroAddress } from 'viem' import { useConfig } from 'wagmi' @@ -158,6 +158,7 @@ export const useNftRewards = ( chainId: JBChainId | undefined, dataSourceAddress: string | undefined, dataHookAddress: `0x${string}` | undefined, + version: JBVersion, ): UseQueryResult => { const config = useConfig() const enabled = Boolean(tiers?.length && dataSourceAddress) @@ -174,19 +175,35 @@ export const useNftRewards = ( const allChainTiersData = await Promise.all( projectChains.map(async currentChainId => { try { - const chainTiers = await readContract(config, { - abi: jb721TiersHookStoreAbi, - address: dataSourceAddress as `0x${string}`, - functionName: 'tiersOf', - args: [ - dataHookAddress ?? zeroAddress as `0x${string}`, - [], // _categories - false, // _includeResolvedUri - 0n, // _startingId - NFT_PAGE_SIZE, // limit - ], - chainId: currentChainId - }) + // The v6 store returns a different tier tuple shape, so the + // versioned ABI is required to decode. Only id/remainingSupply + // are read below, which both shapes expose. + const tiersOfArgs = [ + dataHookAddress ?? (zeroAddress as `0x${string}`), + [], // _categories + false, // _includeResolvedUri + 0n, // _startingId + NFT_PAGE_SIZE, // limit + ] as const + const chainTiers: readonly { + id: number + remainingSupply: number + }[] = + version === 6 + ? await readContract(config, { + abi: jb721TiersHookStoreAbi, + address: dataSourceAddress as `0x${string}`, + functionName: 'tiersOf', + args: tiersOfArgs, + chainId: currentChainId, + }) + : await readContract(config, { + abi: jb721TiersHookStoreV5Abi, + address: dataSourceAddress as `0x${string}`, + functionName: 'tiersOf', + args: tiersOfArgs, + chainId: currentChainId, + }) return { chainId: currentChainId, @@ -209,7 +226,7 @@ export const useNftRewards = ( chainData.chainId === currentChainId )?.tiers - const matchingTier = chainTiersData?.find((chainTier: JB721TierV4) => + const matchingTier = chainTiersData?.find(chainTier => chainTier.id === tier.id ) diff --git a/src/packages/v4v5/contexts/V4V5ProjectMetadataProvider.tsx b/src/packages/v4v5/contexts/V4V5ProjectMetadataProvider.tsx index 5ec7e5f491..738d4955cf 100644 --- a/src/packages/v4v5/contexts/V4V5ProjectMetadataProvider.tsx +++ b/src/packages/v4v5/contexts/V4V5ProjectMetadataProvider.tsx @@ -1,4 +1,4 @@ -import { useJBProjectMetadataContext } from 'juice-sdk-react' +import { useJBProjectMetadataContext } from '@bananapus/nana-sdk-react' import { PV_V4 } from 'constants/pv' import { ProjectMetadataContext } from 'contexts/ProjectMetadataContext' diff --git a/src/packages/v4v5/contexts/V4V5SettingsProvider.tsx b/src/packages/v4v5/contexts/V4V5SettingsProvider.tsx index dd84aa8c03..f3d5246236 100644 --- a/src/packages/v4v5/contexts/V4V5SettingsProvider.tsx +++ b/src/packages/v4v5/contexts/V4V5SettingsProvider.tsx @@ -1,8 +1,8 @@ import { AppWrapper } from 'components/common/CoreAppWrapper/CoreAppWrapper' import { OPEN_IPFS_GATEWAY_HOSTNAME } from 'constants/ipfs' import { TransactionProvider } from 'contexts/Transaction/TransactionProvider' -import { JBChainId, jbUrn } from 'juice-sdk-core' -import { JBProjectProvider } from 'juice-sdk-react' +import { JBChainId, jbUrn } from '@bananapus/nana-sdk-core' +import { JBProjectProvider } from '@bananapus/nana-sdk-react' import { useRouter } from 'next/router' import { Provider } from 'react-redux' import store from 'redux/store' diff --git a/src/packages/v4v5/contexts/V4V5UserNftCreditsProvider.tsx b/src/packages/v4v5/contexts/V4V5UserNftCreditsProvider.tsx index 64cf8f723f..14080f22d7 100644 --- a/src/packages/v4v5/contexts/V4V5UserNftCreditsProvider.tsx +++ b/src/packages/v4v5/contexts/V4V5UserNftCreditsProvider.tsx @@ -1,6 +1,6 @@ import { useWallet } from 'hooks/Wallet' -import { useJBRulesetContext } from 'juice-sdk-react' -import { jb721TiersHookAbi } from 'juice-sdk-core' +import { useJBRulesetContext } from '@bananapus/nana-sdk-react' +import { jb721TiersHookAbi } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import React, { PropsWithChildren } from 'react' diff --git a/src/packages/v4v5/contexts/V4V5UserTotalTokensBalanceProvider.tsx b/src/packages/v4v5/contexts/V4V5UserTotalTokensBalanceProvider.tsx index 09d4f6ca47..b47bde73fe 100644 --- a/src/packages/v4v5/contexts/V4V5UserTotalTokensBalanceProvider.tsx +++ b/src/packages/v4v5/contexts/V4V5UserTotalTokensBalanceProvider.tsx @@ -1,6 +1,6 @@ import { useWallet } from 'hooks/Wallet' -import { useJBContractContext } from 'juice-sdk-react' -import { jbTokensAbi, JBCoreContracts } from 'juice-sdk-core' +import { useJBContractContext } from '@bananapus/nana-sdk-react' +import { jbTokensAbi, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import React, { PropsWithChildren } from 'react' diff --git a/src/packages/v4v5/contexts/V4V5VersionProvider.tsx b/src/packages/v4v5/contexts/V4V5VersionProvider.tsx index 7c4bf7d144..3171531dd5 100644 --- a/src/packages/v4v5/contexts/V4V5VersionProvider.tsx +++ b/src/packages/v4v5/contexts/V4V5VersionProvider.tsx @@ -9,7 +9,7 @@ import React, { } from 'react' interface V4V5VersionContextType { - version: 4 | 5 + version: 4 | 5 | 6 loading: boolean } @@ -28,7 +28,7 @@ export const useV4V5Version = () => { interface V4V5VersionProviderProps extends PropsWithChildren { chainId?: number projectId?: number - defaultVersion?: 4 | 5 + defaultVersion?: 4 | 5 | 6 } export const V4V5VersionProvider: React.FC = ({ @@ -40,10 +40,11 @@ export const V4V5VersionProvider: React.FC = ({ const router = useRouter() // Auto-detect version from route if defaultVersion not provided - const detectedVersion = useMemo((): 4 | 5 => { + const detectedVersion = useMemo((): 4 | 5 | 6 => { if (defaultVersion) return defaultVersion // Detect from pathname + if (router.pathname.startsWith('/v6')) return 6 if (router.pathname.startsWith('/v5')) return 5 if (router.pathname.startsWith('/v4')) return 4 @@ -65,7 +66,7 @@ export const V4V5VersionProvider: React.FC = ({ const version = useMemo(() => { // Use the version from bendystraw if available, otherwise use detected version if (data?.project?.version) { - return data.project.version as 4 | 5 + return data.project.version as 4 | 5 | 6 } return detectedVersion }, [data?.project?.version, detectedVersion]) diff --git a/src/packages/v4v5/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts b/src/packages/v4v5/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts index d64b80b1ac..ffc5f5aa65 100644 --- a/src/packages/v4v5/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts +++ b/src/packages/v4v5/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts @@ -1,12 +1,19 @@ -import { waitForTransactionReceipt } from '@wagmi/core' +import { readContract, waitForTransactionReceipt } from '@wagmi/core' import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' -import { JBChainId } from 'juice-sdk-react' -import { jb721TiersHookProjectDeployerAbi, JB721HookContracts, jbContractAddress } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-react' +import { + jb721TiersHookProjectDeployerAbi, + jb721TiersHookProjectDeployerV5Abi, + JB721HookContracts, + jbContractAddress, + JBCoreContracts, + jbProjectsAbi, +} from '@bananapus/nana-sdk-core' import { useWriteContract } from 'wagmi' import { useNftProjectLaunchData } from 'packages/v4v5/components/Create/hooks/DeployProject/hooks/NFT/useNftProjectLaunchData' import { wagmiConfig } from 'contexts/Para/Providers' import { useContext } from 'react' -import { WaitForTransactionReceiptReturnType } from 'viem' +import { ContractFunctionArgs, WaitForTransactionReceiptReturnType } from 'viem' import { LaunchTxOpts } from '../../useLaunchProjectTx' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' @@ -29,7 +36,7 @@ export function useLaunchProjectWithNftsTx() { const { writeContractAsync: writeLaunchProject } = useWriteContract() const getLaunchData = useNftProjectLaunchData() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' return async ( chainId: JBChainId, @@ -64,13 +71,41 @@ export function useLaunchProjectWithNftsTx() { // }) const deployerAddress = jbContractAddress[versionString][JB721HookContracts.JB721TiersHookProjectDeployer][chainId] - const hash = await writeLaunchProject({ - address: deployerAddress, - abi: jb721TiersHookProjectDeployerAbi, - functionName: 'launchProjectFor', - args, - chainId: chainId as JBChainId, - }) + + let hash: `0x${string}` + if (version === 6) { + // v6: launches are payable and revert unless + // msg.value == JBProjects.creationFee() exactly. + const creationFee = await readContract(wagmiConfig, { + address: jbContractAddress['6'][JBCoreContracts.JBProjects][chainId], + abi: jbProjectsAbi, + functionName: 'creationFee', + chainId, + }) + + hash = await writeLaunchProject({ + address: deployerAddress, + abi: jb721TiersHookProjectDeployerAbi, + functionName: 'launchProjectFor', + args, + chainId: chainId as JBChainId, + value: creationFee, + }) + } else { + // v4/v5: nonpayable, and the 721 config structs differ from v6. The launch data + // carries both key spellings, so it encodes correctly under the v5 ABI too. + hash = await writeLaunchProject({ + address: deployerAddress, + abi: jb721TiersHookProjectDeployerV5Abi, + functionName: 'launchProjectFor', + args: args as unknown as ContractFunctionArgs< + typeof jb721TiersHookProjectDeployerV5Abi, + 'nonpayable', + 'launchProjectFor' + >, + chainId: chainId as JBChainId, + }) + } onTransactionPendingCallback(hash) addTransaction?.('Launch Project', { hash, chainId }) diff --git a/src/packages/v4v5/hooks/useCurrentRouteChainId.ts b/src/packages/v4v5/hooks/useCurrentRouteChainId.ts index 6df05b37f1..aa176cbd54 100644 --- a/src/packages/v4v5/hooks/useCurrentRouteChainId.ts +++ b/src/packages/v4v5/hooks/useCurrentRouteChainId.ts @@ -1,4 +1,4 @@ -import { JB_CHAIN_SLUGS, JBChainId } from 'juice-sdk-core' +import { JB_CHAIN_SLUGS, JBChainId } from '@bananapus/nana-sdk-core' import { useRouter } from 'next/router' export function useCurrentRouteChainId() { diff --git a/src/packages/v4v5/hooks/useDeployOmnichainErc20.ts b/src/packages/v4v5/hooks/useDeployOmnichainErc20.ts index eef2fc08a1..996dee1cbb 100644 --- a/src/packages/v4v5/hooks/useDeployOmnichainErc20.ts +++ b/src/packages/v4v5/hooks/useDeployOmnichainErc20.ts @@ -1,5 +1,5 @@ -import { JBChainId, jbController4_1Abi, jbControllerAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' -import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBContractContext, useSendRelayrTx } from 'juice-sdk-react' +import { JBChainId, jbController4_1Abi, jbControllerAbi, jbControllerV5Abi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' +import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBContractContext, useSendRelayrTx } from '@bananapus/nana-sdk-react' import { ContractFunctionArgs, encodeFunctionData } from 'viem' import { useWallet } from 'hooks/Wallet' @@ -31,8 +31,10 @@ export function useDeployOmnichainErc20() { const args = deployData[chainId] if (!args) throw new Error('No deploy data for chain ' + chainId) + // deployERC20For is signature-identical across v4/v5/v6; pick the + // version-matched ABI anyway to keep the calldata provably correct. const useV41Abi = version === 4 && projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId] - const abi = useV41Abi ? jbController4_1Abi : jbControllerAbi + const abi = version === 6 ? jbControllerAbi : useV41Abi ? jbController4_1Abi : jbControllerV5Abi const to = projectControllerAddress as Address diff --git a/src/packages/v4v5/hooks/useETHReceivedFromTokens.ts b/src/packages/v4v5/hooks/useETHReceivedFromTokens.ts index 4e9f9bf3fc..64b4c74619 100644 --- a/src/packages/v4v5/hooks/useETHReceivedFromTokens.ts +++ b/src/packages/v4v5/hooks/useETHReceivedFromTokens.ts @@ -2,11 +2,11 @@ import { JBChainId, useJBContractContext, useNativeTokenSurplus, -} from 'juice-sdk-react' -import { jbControllerAbi, jbTokensAbi, JBCoreContracts } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbControllerAbi, jbTokensAbi, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' -import { getTokenCashOutQuoteEth } from 'juice-sdk-core' +import { getTokenCashOutQuoteEth } from '@bananapus/nana-sdk-core' import { useJBRulesetByChain } from './useJBRulesetByChain' export function useETHReceivedFromTokens( diff --git a/src/packages/v4v5/hooks/useEditProjectDetailsTx.ts b/src/packages/v4v5/hooks/useEditProjectDetailsTx.ts index fb599ef423..47050af981 100644 --- a/src/packages/v4v5/hooks/useEditProjectDetailsTx.ts +++ b/src/packages/v4v5/hooks/useEditProjectDetailsTx.ts @@ -1,5 +1,5 @@ -import { useJBChainId, useJBContractContext, useJBProjectId } from 'juice-sdk-react' -import { jbControllerAbi } from 'juice-sdk-core' +import { useJBChainId, useJBContractContext, useJBProjectId } from '@bananapus/nana-sdk-react' +import { jbControllerAbi } from '@bananapus/nana-sdk-core' import { useWriteContract } from 'wagmi' import { useCallback, useContext } from 'react' diff --git a/src/packages/v4v5/hooks/useEditRulesetTx.ts b/src/packages/v4v5/hooks/useEditRulesetTx.ts index 1494e68197..ec08afdbf4 100644 --- a/src/packages/v4v5/hooks/useEditRulesetTx.ts +++ b/src/packages/v4v5/hooks/useEditRulesetTx.ts @@ -4,12 +4,13 @@ import { jbContractAddress, jbController4_1Abi, jbControllerAbi, -} from 'juice-sdk-core' + jbControllerV5Abi, +} from '@bananapus/nana-sdk-core' import { JBRulesetContext, useJBChainId, useJBContractContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useCallback, useContext } from 'react' import { useWriteContract } from 'wagmi' @@ -92,9 +93,19 @@ export function useEditRulesetTx() { // console.log('contracts address: ', contracts.controller.data) // console.log('encodedData: ', encodedData) + // v6 uses the canonical (v6) controller ABI. v4.1 has its own ABI. + // v4 (non-4.1) and v5 share the v5 controller ABI, which reads the + // useTotalSurplusForCashOuts metadata flag (renamed in v6). + const abi = + version === 6 + ? jbControllerAbi + : isV4_1 + ? jbController4_1Abi + : jbControllerV5Abi + const hash = await writeEditRuleset({ address: contracts.controller.data, - abi: isV4_1 ? jbController4_1Abi : jbControllerAbi, + abi, functionName: 'queueRulesetsOf', args, }) diff --git a/src/packages/v4v5/hooks/useHasNftRewards.ts b/src/packages/v4v5/hooks/useHasNftRewards.ts index 7e26319d7f..47ffaa7472 100644 --- a/src/packages/v4v5/hooks/useHasNftRewards.ts +++ b/src/packages/v4v5/hooks/useHasNftRewards.ts @@ -1,4 +1,4 @@ -import { useJBRulesetContext } from "juice-sdk-react" +import { useJBRulesetContext } from "@bananapus/nana-sdk-react" import { zeroAddress } from "viem" export function useHasNftRewards() { diff --git a/src/packages/v4v5/hooks/useJBAllRulesetsCrossChain.ts b/src/packages/v4v5/hooks/useJBAllRulesetsCrossChain.ts index 5c6cc65ed5..1c227a37d5 100644 --- a/src/packages/v4v5/hooks/useJBAllRulesetsCrossChain.ts +++ b/src/packages/v4v5/hooks/useJBAllRulesetsCrossChain.ts @@ -1,6 +1,5 @@ -import { CashOutTaxRate, ReservedPercent, RulesetWeight, WeightCutPercent, jbControllerAbi, jbContractAddress, JBCoreContracts, JBRulesetData, JBRulesetMetadata } from "juice-sdk-core" +import { CashOutTaxRate, JBChainId, ReservedPercent, RulesetWeight, WeightCutPercent, jbControllerAbi, jbContractAddress, JBCoreContracts, JBRulesetData, JBRulesetMetadata } from "@bananapus/nana-sdk-core" import { useReadContract } from "wagmi" -import { JBChainId } from "juice-sdk-react" import { useV4V5Version } from '../contexts/V4V5VersionProvider' export type RulesetWithMetadata = { @@ -21,11 +20,16 @@ export function useJBAllRulesetsCrossChain({ size?: bigint }) { const { version } = useV4V5Version() - // For v4, use JBController4_1. For v5, use standard JBController + // For v4, use JBController4_1. For v5/v6, use that version's standard JBController const controllerAddress = version === 4 ? jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId] - : jbContractAddress['5'][JBCoreContracts.JBController][chainId] + : version === 5 + ? jbContractAddress['5'][JBCoreContracts.JBController][chainId] + : jbContractAddress['6'][JBCoreContracts.JBController][chainId] + // The v6 controller ABI is layout-compatible with v4/v5 for allRulesetsOf: v6 only + // renamed the useTotalSurplusForCashOuts metadata bool to scopeCashOutsToLocalBalances + // (with inverted meaning), which is normalized below. const { data, isLoading, refetch } = useReadContract({ abi: jbControllerAbi, address: controllerAddress, @@ -49,6 +53,13 @@ export function useJBAllRulesetsCrossChain({ }, metadata: { ...obj.metadata, + // On v4/v5 controllers this bit means useTotalSurplusForCashOuts, the + // inverse of v6's scopeCashOutsToLocalBalances. Flip it so the flag + // carries v6 semantics for every version. + scopeCashOutsToLocalBalances: + version === 6 + ? obj.metadata.scopeCashOutsToLocalBalances + : !obj.metadata.scopeCashOutsToLocalBalances, cashOutTaxRate: new CashOutTaxRate(obj.metadata.cashOutTaxRate), reservedPercent: new ReservedPercent(obj.metadata.reservedPercent) } diff --git a/src/packages/v4v5/hooks/useJBRulesetByChain.ts b/src/packages/v4v5/hooks/useJBRulesetByChain.ts index 2afaae8d11..3b8b5ef046 100644 --- a/src/packages/v4v5/hooks/useJBRulesetByChain.ts +++ b/src/packages/v4v5/hooks/useJBRulesetByChain.ts @@ -1,10 +1,10 @@ import { JBChainId -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { useJBProjectId, useJBRuleset -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' export function useJBRulesetByChain(chainId: JBChainId | undefined) { const { projectId } = useJBProjectId(chainId) diff --git a/src/packages/v4v5/hooks/useJBRulesetHistory.ts b/src/packages/v4v5/hooks/useJBRulesetHistory.ts index 92ebd406f8..b821a5e0cf 100644 --- a/src/packages/v4v5/hooks/useJBRulesetHistory.ts +++ b/src/packages/v4v5/hooks/useJBRulesetHistory.ts @@ -1,5 +1,5 @@ -import { JBRulesetData, JBRulesetMetadata } from 'juice-sdk-core' -import { useJBProjectId, useJBRuleset } from 'juice-sdk-react' +import { JBRulesetData, JBRulesetMetadata } from '@bananapus/nana-sdk-core' +import { useJBProjectId, useJBRuleset } from '@bananapus/nana-sdk-react' import { useCallback, useEffect, useMemo, useState } from 'react' import { useJBAllRulesetsCrossChain, RulesetWithMetadata } from './useJBAllRulesetsCrossChain' import { useJBUpcomingRuleset } from './useJBUpcomingRuleset' diff --git a/src/packages/v4v5/hooks/useJBUpcomingRuleset.ts b/src/packages/v4v5/hooks/useJBUpcomingRuleset.ts index e6bd9cf6d5..5f0f547ac9 100644 --- a/src/packages/v4v5/hooks/useJBUpcomingRuleset.ts +++ b/src/packages/v4v5/hooks/useJBUpcomingRuleset.ts @@ -6,12 +6,12 @@ import { RulesetWeight, WeightCutPercent, jbControllerAbi, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { JBChainId, useJBContractContext, useJBProjectId, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' diff --git a/src/packages/v4v5/hooks/useLaunchProjectTx.ts b/src/packages/v4v5/hooks/useLaunchProjectTx.ts index 17fbfc4788..124faea1b1 100644 --- a/src/packages/v4v5/hooks/useLaunchProjectTx.ts +++ b/src/packages/v4v5/hooks/useLaunchProjectTx.ts @@ -1,4 +1,4 @@ -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { useCallback, useContext } from 'react' import { Address, @@ -7,10 +7,17 @@ import { } from 'viem' import { useWriteContract } from 'wagmi' -import { waitForTransactionReceipt } from '@wagmi/core' +import { readContract, waitForTransactionReceipt } from '@wagmi/core' import { wagmiConfig } from 'contexts/Para/Providers' import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' -import { jbControllerAbi } from 'juice-sdk-core' +import { + jbContractAddress, + jbControllerAbi, + jbControllerV5Abi, + JBCoreContracts, + jbProjectsAbi, +} from '@bananapus/nana-sdk-core' +import { useV4V5Version } from '../contexts/V4V5VersionProvider' const CREATE_EVENT_IDX = 2 const OMNICHAIN_721_CREATE_EVENT_IDX = 10 @@ -18,6 +25,12 @@ const PROJECT_ID_TOPIC_IDX = 1 const OMNICHAIN_721_PROJECT_ID_TOPIC_IDX = 2 const HEX_BASE = 16 +// keccak256('Transfer(address,address,uint256)') +const ERC721_TRANSFER_TOPIC = + '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' +const ZERO_TOPIC = + '0x0000000000000000000000000000000000000000000000000000000000000000' + export interface LaunchTxOpts { onTransactionPending: (hash: `0x${string}`) => void onTransactionConfirmed: (hash: `0x${string}`, projectId: number) => void @@ -36,6 +49,20 @@ export const getProjectIdFromLaunchReceipt = ( omnichain721?: boolean } = {}, ): number => { + // The project NFT mint (an ERC-721 Transfer from the zero address, i.e. 4 topics with a + // zero `from`) is the only such log in a launch receipt and holds the project ID as its + // tokenId — position-independent, so it survives per-version differences in log ordering. + const mintLog = txReceipt?.logs?.find( + log => + log.topics?.[0] === ERC721_TRANSFER_TOPIC && + log.topics.length === 4 && + log.topics[1] === ZERO_TOPIC, + ) + if (mintLog?.topics?.[3]) { + return parseInt(mintLog.topics[3], HEX_BASE) + } + + // Fallback: legacy fixed log positions. const eventIdx = omnichain721 ? OMNICHAIN_721_CREATE_EVENT_IDX : CREATE_EVENT_IDX @@ -59,12 +86,13 @@ export const getProjectIdFromLaunchReceipt = ( export function useLaunchProjectTx() { const { addTransaction } = useContext(TxHistoryContext) const { writeContractAsync: writeLaunchProject } = useWriteContract() + const { version } = useV4V5Version() return useCallback( async ( launchProjectForData: ContractFunctionArgs< typeof jbControllerAbi, - 'nonpayable', + 'payable', 'launchProjectFor' >, controllerAddress: Address | undefined, @@ -80,16 +108,40 @@ export function useLaunchProjectTx() { } try { - // V5 projects always use jbControllerAbi - const abi = jbControllerAbi + let hash: `0x${string}` + if (version === 6) { + // v6: launchProjectFor is payable and reverts unless + // msg.value == JBProjects.creationFee() exactly. + const creationFee = await readContract(wagmiConfig, { + address: jbContractAddress['6'][JBCoreContracts.JBProjects][chainId], + abi: jbProjectsAbi, + functionName: 'creationFee', + chainId, + }) - const hash = await writeLaunchProject({ - address: controllerAddress, - abi, - functionName: 'launchProjectFor', - args: launchProjectForData, - chainId, - }) + hash = await writeLaunchProject({ + address: controllerAddress, + abi: jbControllerAbi, + functionName: 'launchProjectFor', + args: launchProjectForData, + chainId, + value: creationFee, + }) + } else { + // v4/v5 launches are nonpayable. The transformer emits both the v5 and v6 + // metadata key spellings, so the same args encode correctly under either ABI. + hash = await writeLaunchProject({ + address: controllerAddress, + abi: jbControllerV5Abi, + functionName: 'launchProjectFor', + args: launchProjectForData as unknown as ContractFunctionArgs< + typeof jbControllerV5Abi, + 'nonpayable', + 'launchProjectFor' + >, + chainId, + }) + } onTransactionPendingCallback(hash) addTransaction?.('Launch Project', { hash, chainId }) @@ -110,6 +162,6 @@ export function useLaunchProjectTx() { return true } }, - [writeLaunchProject, addTransaction], + [writeLaunchProject, addTransaction, version], ) } diff --git a/src/packages/v4v5/hooks/useNftRewardsEnabledForPay.ts b/src/packages/v4v5/hooks/useNftRewardsEnabledForPay.ts index deb9d5964f..5ce7b0ed05 100644 --- a/src/packages/v4v5/hooks/useNftRewardsEnabledForPay.ts +++ b/src/packages/v4v5/hooks/useNftRewardsEnabledForPay.ts @@ -1,4 +1,4 @@ -import { JBRulesetContext, useJBProjectId, useJBRulesetContext, useJBUpcomingRuleset } from 'juice-sdk-react' +import { JBRulesetContext, useJBProjectId, useJBRulesetContext, useJBUpcomingRuleset } from '@bananapus/nana-sdk-react' import React from 'react' import { useV4V5NftRewards } from '../contexts/V4V5NftRewards/V4V5NftRewardsProvider' diff --git a/src/packages/v4v5/hooks/useOmnichainEditProjectDetailsTx.ts b/src/packages/v4v5/hooks/useOmnichainEditProjectDetailsTx.ts index e56e26fbf1..8acdf76522 100644 --- a/src/packages/v4v5/hooks/useOmnichainEditProjectDetailsTx.ts +++ b/src/packages/v4v5/hooks/useOmnichainEditProjectDetailsTx.ts @@ -1,8 +1,8 @@ -import { JBChainId, jbControllerAbi } from 'juice-sdk-core' -import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBContractContext, useSendRelayrTx } from 'juice-sdk-react' +import { JBChainId, jbControllerAbi } from '@bananapus/nana-sdk-core' +import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBContractContext, useSendRelayrTx } from '@bananapus/nana-sdk-react' import { useWallet } from 'hooks/Wallet' -import { useSuckers } from 'juice-sdk-react' +import { useSuckers } from '@bananapus/nana-sdk-react' import { encodeFunctionData } from 'viem' import { estimateContractGasWithFallback, OMNICHAIN_GAS_FALLBACKS } from '../utils/estimateOmnichainGas' diff --git a/src/packages/v4v5/hooks/usePayProjectDisabled.ts b/src/packages/v4v5/hooks/usePayProjectDisabled.ts index e72c97ccda..ea85adb9f0 100644 --- a/src/packages/v4v5/hooks/usePayProjectDisabled.ts +++ b/src/packages/v4v5/hooks/usePayProjectDisabled.ts @@ -1,4 +1,4 @@ -import { useJBChainId, useJBProjectId, useJBRuleset } from 'juice-sdk-react' +import { useJBChainId, useJBProjectId, useJBRuleset } from '@bananapus/nana-sdk-react' import { t } from '@lingui/macro' import { useProjectIsOFACListed } from 'hooks/useProjectIsOFACListed' diff --git a/src/packages/v4v5/hooks/usePayoutLimit.ts b/src/packages/v4v5/hooks/usePayoutLimit.ts index 7676bce34d..28eb7c9c22 100644 --- a/src/packages/v4v5/hooks/usePayoutLimit.ts +++ b/src/packages/v4v5/hooks/usePayoutLimit.ts @@ -5,11 +5,11 @@ import { useJBContractContext, useJBProjectId, useJBRuleset, -} from 'juice-sdk-react' -import { jbFundAccessLimitsAbi } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbFundAccessLimitsAbi } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' -import { NATIVE_TOKEN } from 'juice-sdk-core' +import { NATIVE_TOKEN } from '@bananapus/nana-sdk-core' import { V4V5CurrencyOption } from '../models/v4CurrencyOption' import { V4V5_CURRENCY_ETH } from '../utils/currency' diff --git a/src/packages/v4v5/hooks/usePayoutLimitOfChain.ts b/src/packages/v4v5/hooks/usePayoutLimitOfChain.ts index f4376ad716..9037170749 100644 --- a/src/packages/v4v5/hooks/usePayoutLimitOfChain.ts +++ b/src/packages/v4v5/hooks/usePayoutLimitOfChain.ts @@ -4,9 +4,9 @@ import { JBChainId, useJBContractContext, useJBRuleset, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' -import { NATIVE_TOKEN, jbDirectoryAbi, jbFundAccessLimitsAbi, JBCoreContracts } from 'juice-sdk-core' +import { NATIVE_TOKEN, jbDirectoryAbi, jbFundAccessLimitsAbi, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import { V4V5CurrencyOption } from '../models/v4CurrencyOption' import { V4V5_CURRENCY_ETH } from '../utils/currency' diff --git a/src/packages/v4v5/hooks/usePopulateNftUpdateTx.ts b/src/packages/v4v5/hooks/usePopulateNftUpdateTx.ts index a68888e622..058c179b8c 100644 --- a/src/packages/v4v5/hooks/usePopulateNftUpdateTx.ts +++ b/src/packages/v4v5/hooks/usePopulateNftUpdateTx.ts @@ -2,9 +2,10 @@ import { JB_721_TIER_PARAMS_V4, NftRewardTier } from 'models/nftRewards' import { buildJB721TierParams, pinNftRewards } from 'utils/nftRewards' import { NEW_NFT_ID_LOWER_LIMIT } from 'components/NftRewards/RewardsList/AddEditRewardModal' -import { useJBRulesetContext } from 'juice-sdk-react' -import { jb721TiersHookAbi } from 'juice-sdk-core' -import { JB721DelegateVersion } from 'models/JB721Delegate' +import { useJBRulesetContext } from '@bananapus/nana-sdk-react' +import { jb721TiersHookAbi, jb721TiersHookV5Abi } from '@bananapus/nana-sdk-core' +import { JB721DelegateVersion, jb721TierConfigToV6 } from 'models/JB721Delegate' +import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { useCallback } from 'react' import { encodeFunctionData } from 'viem' @@ -15,6 +16,7 @@ export function usePopulateNftUpdateTx() { const { rulesetMetadata: { data: rulesetMetadata }, } = useJBRulesetContext() + const { version } = useV4V5Version() const populateTransaction = useCallback( async (rewardTiers: NftRewardTier[], editedRewardTierIds: number[]) => { @@ -34,14 +36,30 @@ export function usePopulateNftUpdateTx() { const tiersToAdd = buildJB721TierParams({ cids: rewardTiersCIDs, rewardTiers: newRewardTiers, - version: JB721DelegateVersion.JB721DELEGATE_V4, + version: + version === 6 + ? JB721DelegateVersion.JB721DELEGATE_V6 + : version === 5 + ? JB721DelegateVersion.JB721DELEGATE_V5 + : JB721DelegateVersion.JB721DELEGATE_V4, }) as JB_721_TIER_PARAMS_V4[] - const data = encodeFunctionData({ - abi: jb721TiersHookAbi, - functionName: 'adjustTiers', - args: [tiersToAdd, editedRewardTierIds.map(id => BigInt(id))], - }) + const tierIdsToRemove = editedRewardTierIds.map(id => BigInt(id)) + + // The v6 hook's adjustTiers takes a different tier config shape + // (nested flags tuple + splitPercent/splits) than v4/v5. + const data = + version === 6 + ? encodeFunctionData({ + abi: jb721TiersHookAbi, + functionName: 'adjustTiers', + args: [tiersToAdd.map(jb721TierConfigToV6), tierIdsToRemove], + }) + : encodeFunctionData({ + abi: jb721TiersHookV5Abi, + functionName: 'adjustTiers', + args: [tiersToAdd, tierIdsToRemove], + }) return { to: rulesetMetadata.dataHook, @@ -49,7 +67,7 @@ export function usePopulateNftUpdateTx() { value: '0', } }, - [rulesetMetadata?.dataHook], + [rulesetMetadata?.dataHook, version], ) return { populateTransaction } diff --git a/src/packages/v4v5/hooks/usePopulateProjectDetailsTx.ts b/src/packages/v4v5/hooks/usePopulateProjectDetailsTx.ts index 3571eb8dea..f0625cb817 100644 --- a/src/packages/v4v5/hooks/usePopulateProjectDetailsTx.ts +++ b/src/packages/v4v5/hooks/usePopulateProjectDetailsTx.ts @@ -1,5 +1,5 @@ -import { jbControllerAbi } from 'juice-sdk-core' -import { useJBContractContext } from 'juice-sdk-react' +import { jbControllerAbi } from '@bananapus/nana-sdk-core' +import { useJBContractContext } from '@bananapus/nana-sdk-react' import { useCallback } from 'react' import { encodeFunctionData } from 'viem' diff --git a/src/packages/v4v5/hooks/useProjectHasErc20Token.ts b/src/packages/v4v5/hooks/useProjectHasErc20Token.ts index 4a62028232..335683cffb 100644 --- a/src/packages/v4v5/hooks/useProjectHasErc20Token.ts +++ b/src/packages/v4v5/hooks/useProjectHasErc20Token.ts @@ -1,4 +1,4 @@ -import { useJBTokenContext } from 'juice-sdk-react' +import { useJBTokenContext } from '@bananapus/nana-sdk-react' import { isZeroAddress } from 'utils/address' export const useProjectHasErc20Token = () => { diff --git a/src/packages/v4v5/hooks/useProjectRulesetsDiffAcrossChains.ts b/src/packages/v4v5/hooks/useProjectRulesetsDiffAcrossChains.ts index 72896c3fb3..8b57cffd90 100644 --- a/src/packages/v4v5/hooks/useProjectRulesetsDiffAcrossChains.ts +++ b/src/packages/v4v5/hooks/useProjectRulesetsDiffAcrossChains.ts @@ -1,5 +1,5 @@ -import { JBChainId, JBRulesetData, JBRulesetMetadata } from "juice-sdk-core"; -import { useJBContractContext, useSuckers } from "juice-sdk-react"; +import { JBChainId, JBRulesetData, JBRulesetMetadata } from "@bananapus/nana-sdk-core"; +import { useJBContractContext, useSuckers } from "@bananapus/nana-sdk-react"; export function useProjectRulesetsDiffAcrossChains(type: 'upcoming' | 'current') { diff --git a/src/packages/v4v5/hooks/useProposeSafeEditRulesetTx.ts b/src/packages/v4v5/hooks/useProposeSafeEditRulesetTx.ts index b25470b6ab..8fb76cffc1 100644 --- a/src/packages/v4v5/hooks/useProposeSafeEditRulesetTx.ts +++ b/src/packages/v4v5/hooks/useProposeSafeEditRulesetTx.ts @@ -1,9 +1,9 @@ -import { JBChainId, NATIVE_TOKEN, jbContractAddress, JBCoreContracts, jbController4_1Abi, jbControllerAbi } from 'juice-sdk-core' +import { JBChainId, NATIVE_TOKEN, jbContractAddress, JBCoreContracts, jbController4_1Abi, jbControllerAbi, jbControllerV5Abi } from '@bananapus/nana-sdk-core' import { JBRulesetContext, useJBContractContext, useSuckers -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { SafeProposeTransactionResponse, useProposeSafeTransaction } from './useProposeSafeTransaction' import { useCallback, useContext } from 'react' import { useV4V5Version } from '../contexts/V4V5VersionProvider' @@ -60,7 +60,14 @@ export function useProposeSafeEditRulesetTx({ safeAddress }: { safeAddress: stri const projectControllerAddress = contracts.controller.data let data: `0x${string}` - if (version === 4 && projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId]) { + if (version === 6) { + // Use v6 controller ABI (reads the scopeCashOutsToLocalBalances metadata flag) + data = encodeFunctionData({ + abi: jbControllerAbi, + functionName: 'queueRulesetsOf', + args, + }) + } else if (version === 4 && projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId]) { // Use v4.1 controller ABI data = encodeFunctionData({ abi: jbController4_1Abi, @@ -68,9 +75,9 @@ export function useProposeSafeEditRulesetTx({ safeAddress }: { safeAddress: stri args, }) } else { - // Use v4 controller ABI + // Use v4/v5 controller ABI (reads the useTotalSurplusForCashOuts metadata flag) data = encodeFunctionData({ - abi: jbControllerAbi, + abi: jbControllerV5Abi, functionName: 'queueRulesetsOf', args, }) diff --git a/src/packages/v4v5/hooks/useProposeSafeLaunchProjectTx.ts b/src/packages/v4v5/hooks/useProposeSafeLaunchProjectTx.ts index f001f3e9dc..525e4472f9 100644 --- a/src/packages/v4v5/hooks/useProposeSafeLaunchProjectTx.ts +++ b/src/packages/v4v5/hooks/useProposeSafeLaunchProjectTx.ts @@ -1,4 +1,17 @@ -import { JBChainId, jbContractAddress, JBCoreContracts, JB721HookContracts, jb721TiersHookProjectDeployerAbi, jbController4_1Abi } from 'juice-sdk-core' +import { + JBChainId, + jbContractAddress, + JBCoreContracts, + JB721HookContracts, + jb721TiersHookProjectDeployerAbi, + jb721TiersHookProjectDeployerV5Abi, + jbController4_1Abi, + jbControllerAbi, + jbControllerV5Abi, + jbProjectsAbi, +} from '@bananapus/nana-sdk-core' +import { readContract } from '@wagmi/core' +import { wagmiConfig } from 'contexts/Para/Providers' import { ContractFunctionArgs, encodeFunctionData } from 'viem' import { SafeProposeTransactionResponse, useProposeSafeTransaction } from './useProposeSafeTransaction' import { useV4V5Version } from '../contexts/V4V5VersionProvider' @@ -13,17 +26,17 @@ export interface SafeLaunchProjectData { nftCollectionMetadataUri: string } standardProjectData?: { - [k in JBChainId]?: ContractFunctionArgs + [k in JBChainId]?: ContractFunctionArgs } nftProjectData?: { - [k in JBChainId]?: ContractFunctionArgs + [k in JBChainId]?: ContractFunctionArgs } } export function useProposeSafeLaunchProjectTx({ safeAddress }: { safeAddress: string }) { const { proposeTransaction } = useProposeSafeTransaction({ safeAddress }) const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const proposeLaunchProjectTx = useCallback( async ( chainId: JBChainId, @@ -42,12 +55,24 @@ export function useProposeSafeLaunchProjectTx({ safeAddress }: { safeAddress: st throw new Error(`No NFT project data for chain ${chainId}`) } - data = encodeFunctionData({ - abi: jb721TiersHookProjectDeployerAbi, - functionName: 'launchProjectFor', - args, - }) - + // The launch data carries both the v5 and v6 721 config key spellings, so it + // encodes correctly under whichever ABI matches the version. + data = version === 6 + ? encodeFunctionData({ + abi: jb721TiersHookProjectDeployerAbi, + functionName: 'launchProjectFor', + args, + }) + : encodeFunctionData({ + abi: jb721TiersHookProjectDeployerV5Abi, + functionName: 'launchProjectFor', + args: args as unknown as ContractFunctionArgs< + typeof jb721TiersHookProjectDeployerV5Abi, + 'nonpayable', + 'launchProjectFor' + >, + }) + to = jbContractAddress[versionString][JB721HookContracts.JB721TiersHookProjectDeployer][chainId] as `0x${string}` } else { // Standard project launch @@ -56,22 +81,59 @@ export function useProposeSafeLaunchProjectTx({ safeAddress }: { safeAddress: st throw new Error(`No standard project data for chain ${chainId}`) } - data = encodeFunctionData({ - abi: jbController4_1Abi, - functionName: 'launchProjectFor', - args, - }) + // The launch data carries both the v5 and v6 metadata key spellings, so it + // encodes correctly under whichever ABI matches the version. + data = + version === 6 + ? encodeFunctionData({ + abi: jbControllerAbi, + functionName: 'launchProjectFor', + args, + }) + : version === 4 + ? encodeFunctionData({ + abi: jbController4_1Abi, + functionName: 'launchProjectFor', + args: args as unknown as ContractFunctionArgs< + typeof jbController4_1Abi, + 'nonpayable', + 'launchProjectFor' + >, + }) + : encodeFunctionData({ + abi: jbControllerV5Abi, + functionName: 'launchProjectFor', + args: args as unknown as ContractFunctionArgs< + typeof jbControllerV5Abi, + 'nonpayable', + 'launchProjectFor' + >, + }) - // For standard projects, use JBController4_1 for v4, JBController for v5 + // For standard projects, use JBController4_1 for v4, JBController for v5/v6 to = version === 4 ? jbContractAddress['4'][JBCoreContracts.JBController4_1][chainId] as `0x${string}` - : jbContractAddress['5'][JBCoreContracts.JBController][chainId] as `0x${string}` + : jbContractAddress[versionString as '5' | '6'][JBCoreContracts.JBController][chainId] as `0x${string}` } + // v6: launches are payable and revert unless msg.value == JBProjects.creationFee() + // exactly, so the Safe tx must carry the fee. + const value = + version === 6 + ? ( + await readContract(wagmiConfig, { + address: jbContractAddress['6'][JBCoreContracts.JBProjects][chainId], + abi: jbProjectsAbi, + functionName: 'creationFee', + chainId, + }) + ).toString() + : '0' + // Propose the transaction to the Safe return await proposeTransaction({ to, - value: '0', + value, data, chainId, signerAddressOverride, diff --git a/src/packages/v4v5/hooks/useProposeSafeTransaction.ts b/src/packages/v4v5/hooks/useProposeSafeTransaction.ts index b4aca98c71..11205ddbc8 100644 --- a/src/packages/v4v5/hooks/useProposeSafeTransaction.ts +++ b/src/packages/v4v5/hooks/useProposeSafeTransaction.ts @@ -5,7 +5,7 @@ import SafeApiKit from '@safe-global/api-kit' import { estimateTxBaseGas } from '@safe-global/protocol-kit' import { NETWORKS } from 'constants/networks' import { useWallet } from 'hooks/Wallet' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { useState } from 'react' import { emitErrorNotification } from 'utils/notifications' import { getAddress } from 'viem' diff --git a/src/packages/v4v5/hooks/useProposeSafeTransferOwnershipTx.ts b/src/packages/v4v5/hooks/useProposeSafeTransferOwnershipTx.ts index 9bfe6618e5..6271f39907 100644 --- a/src/packages/v4v5/hooks/useProposeSafeTransferOwnershipTx.ts +++ b/src/packages/v4v5/hooks/useProposeSafeTransferOwnershipTx.ts @@ -1,7 +1,7 @@ -import { JBChainId, jbContractAddress, JBCoreContracts, jbProjectsAbi } from 'juice-sdk-core' +import { JBChainId, jbContractAddress, JBCoreContracts, jbProjectsAbi } from '@bananapus/nana-sdk-core' import { useSuckers -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { Address, encodeFunctionData } from 'viem' import { SafeProposeTransactionResponse, useProposeSafeTransaction } from './useProposeSafeTransaction' import { useV4V5Version } from '../contexts/V4V5VersionProvider' @@ -12,7 +12,7 @@ export function useProposeSafeTransferOwnershipTx({ safeAddress }: { safeAddress const { proposeTransaction } = useProposeSafeTransaction({ safeAddress }) const { data: suckers } = useSuckers() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const proposeTransferOwnershipTx = useCallback( async ( diff --git a/src/packages/v4v5/hooks/useSuckersPendingReservedTokens.ts b/src/packages/v4v5/hooks/useSuckersPendingReservedTokens.ts index 2812eb48f3..094f5761e3 100644 --- a/src/packages/v4v5/hooks/useSuckersPendingReservedTokens.ts +++ b/src/packages/v4v5/hooks/useSuckersPendingReservedTokens.ts @@ -4,9 +4,9 @@ import { jbControllerAbi, jbContractAddress, JBCoreContracts -} from "juice-sdk-core"; +} from "@bananapus/nana-sdk-core"; import { readContract } from "wagmi/actions"; -import { useJBChainId, useJBContractContext, useSuckers } from "juice-sdk-react"; +import { useJBChainId, useJBContractContext, useSuckers } from "@bananapus/nana-sdk-react"; import { useConfig } from "wagmi"; import { useQuery } from "wagmi/query"; import { useV4V5Version } from '../contexts/V4V5VersionProvider'; @@ -14,7 +14,7 @@ import { useV4V5Version } from '../contexts/V4V5VersionProvider'; export function useSuckersPendingReservedTokens() { const config = useConfig(); const { version } = useV4V5Version(); - const versionString = version.toString() as '4' | '5'; + const versionString = version.toString() as '4' | '5' | '6'; const chainId = useJBChainId(); diff --git a/src/packages/v4v5/hooks/useSuckersTotalSupply.ts b/src/packages/v4v5/hooks/useSuckersTotalSupply.ts index 8a61912518..309738a466 100644 --- a/src/packages/v4v5/hooks/useSuckersTotalSupply.ts +++ b/src/packages/v4v5/hooks/useSuckersTotalSupply.ts @@ -4,9 +4,9 @@ import { jbControllerAbi, jbContractAddress, JBCoreContracts -} from "juice-sdk-core"; +} from "@bananapus/nana-sdk-core"; import { readContract } from "wagmi/actions"; -import { useJBChainId, useJBContractContext, useSuckers } from "juice-sdk-react"; +import { useJBChainId, useJBContractContext, useSuckers } from "@bananapus/nana-sdk-react"; import { useConfig } from "wagmi"; import { useQuery } from "wagmi/query"; import { useV4V5Version } from '../contexts/V4V5VersionProvider'; @@ -14,7 +14,7 @@ import { useV4V5Version } from '../contexts/V4V5VersionProvider'; export function useSuckersTotalSupply() { const config = useConfig(); const { version } = useV4V5Version(); - const versionString = version.toString() as '4' | '5'; + const versionString = version.toString() as '4' | '5' | '6'; const chainId = useJBChainId(); diff --git a/src/packages/v4v5/hooks/useSuckersUnclaimedBalance.ts b/src/packages/v4v5/hooks/useSuckersUnclaimedBalance.ts index 19a9e438cb..32adbe1470 100644 --- a/src/packages/v4v5/hooks/useSuckersUnclaimedBalance.ts +++ b/src/packages/v4v5/hooks/useSuckersUnclaimedBalance.ts @@ -3,9 +3,9 @@ import { jbTokensAbi, jbContractAddress, JBCoreContracts -} from "juice-sdk-core"; +} from "@bananapus/nana-sdk-core"; import { readContract } from "wagmi/actions"; -import { useJBContractContext, useSuckers } from "juice-sdk-react"; +import { useJBContractContext, useSuckers } from "@bananapus/nana-sdk-react"; import { useWallet } from "hooks/Wallet"; import { zeroAddress } from "viem"; @@ -18,7 +18,7 @@ export function useSuckersUnclaimedBalance() { const { userAddress } = useWallet(); const { projectId: mainProjectId } = useJBContractContext(); const { version } = useV4V5Version(); - const versionString = version.toString() as '4' | '5'; + const versionString = version.toString() as '4' | '5' | '6'; const suckersQuery = useSuckers(); const pairs: SuckerPair[] = suckersQuery.data ?? []; diff --git a/src/packages/v4v5/hooks/useTerminalFee.ts b/src/packages/v4v5/hooks/useTerminalFee.ts new file mode 100644 index 0000000000..c56cf9967a --- /dev/null +++ b/src/packages/v4v5/hooks/useTerminalFee.ts @@ -0,0 +1,32 @@ +import { + JBCoreContracts, + jbMultiTerminalV5Abi, +} from '@bananapus/nana-sdk-core' +import { useReadContract } from 'wagmi' + +import { useJBContractContext } from '@bananapus/nana-sdk-react' +import { useV4V5Version } from '../contexts/V4V5VersionProvider' + +/** + * The v6 protocol fee (2.5%) expressed per billion, matching the units of the v4/v5 + * `JBMultiTerminal.FEE()` getter. v6 made the fee a compile-time constant + * (`JBConstants.STANDARD_FEE`), so there is nothing to read onchain. + */ +const V6_TERMINAL_FEE_PER_BILLION = 25_000_000n + +/** + * The terminal fee (per billion) for the current project's version. + */ +export function useTerminalFee(): bigint | undefined { + const { version } = useV4V5Version() + const { contractAddress } = useJBContractContext() + + const { data: v5Fee } = useReadContract({ + abi: jbMultiTerminalV5Abi, + address: contractAddress(JBCoreContracts.JBMultiTerminal), + functionName: 'FEE', + query: { enabled: version !== 6 }, + }) + + return version === 6 ? V6_TERMINAL_FEE_PER_BILLION : v5Fee +} diff --git a/src/packages/v4v5/hooks/useTransferOmnichainProjectOwnership.ts b/src/packages/v4v5/hooks/useTransferOmnichainProjectOwnership.ts index 88b7a20467..120526aac7 100644 --- a/src/packages/v4v5/hooks/useTransferOmnichainProjectOwnership.ts +++ b/src/packages/v4v5/hooks/useTransferOmnichainProjectOwnership.ts @@ -1,5 +1,5 @@ -import { JBChainId, jbContractAddress, JBCoreContracts, jbProjectsAbi } from 'juice-sdk-core' -import { useGetRelayrTxBundle, useGetRelayrTxQuote, useSendRelayrTx } from 'juice-sdk-react' +import { JBChainId, jbContractAddress, JBCoreContracts, jbProjectsAbi } from '@bananapus/nana-sdk-core' +import { useGetRelayrTxBundle, useGetRelayrTxQuote, useSendRelayrTx } from '@bananapus/nana-sdk-react' import { Address, encodeFunctionData } from 'viem' import { useWallet } from 'hooks/Wallet' @@ -12,7 +12,7 @@ export function useTransferOmnichainProjectOwnership() { const { sendRelayrTx } = useSendRelayrTx() const relayrBundle = useGetRelayrTxBundle() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' async function transferOmnichainProjectOwnership( diff --git a/src/packages/v4v5/hooks/useTransferOwnershipOnChain.ts b/src/packages/v4v5/hooks/useTransferOwnershipOnChain.ts index 48b5772b73..fc3ba3e972 100644 --- a/src/packages/v4v5/hooks/useTransferOwnershipOnChain.ts +++ b/src/packages/v4v5/hooks/useTransferOwnershipOnChain.ts @@ -1,8 +1,8 @@ import { readContract, waitForTransactionReceipt } from '@wagmi/core' -import { JBChainId, jbContractAddress, JBCoreContracts, jbProjectsAbi } from 'juice-sdk-core' +import { JBChainId, jbContractAddress, JBCoreContracts, jbProjectsAbi } from '@bananapus/nana-sdk-core' import { useSuckers -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useWriteContract } from 'wagmi' import { useCallback } from 'react' import { Address } from 'viem' @@ -13,7 +13,7 @@ export function useTransferOwnershipOnChain() { const { data: suckers } = useSuckers() const { writeContractAsync: safeTransferFromTx } = useWriteContract() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const transferOwnershipOnChain = useCallback( async ( diff --git a/src/packages/v4v5/hooks/useTransferProjectOwnershipTx.ts b/src/packages/v4v5/hooks/useTransferProjectOwnershipTx.ts index 82f2d88d7c..641550df7c 100644 --- a/src/packages/v4v5/hooks/useTransferProjectOwnershipTx.ts +++ b/src/packages/v4v5/hooks/useTransferProjectOwnershipTx.ts @@ -1,5 +1,5 @@ -import { useJBContractContext, useJBProjectMetadataContext, JBChainId } from 'juice-sdk-react' -import { jbProjectsAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +import { useJBContractContext, useJBProjectMetadataContext, JBChainId } from '@bananapus/nana-sdk-react' +import { jbProjectsAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useWriteContract, useChainId } from 'wagmi' import { useCallback, useContext } from 'react' @@ -16,7 +16,7 @@ export function useTransferProjectOwnershipTx() { const { projectId } = useJBContractContext() const { data: projectOwnerAddress } = useV4V5ProjectOwnerOf() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' // Get project title inline const { projectMetadata } = useContext(ProjectMetadataContext) diff --git a/src/packages/v4v5/hooks/useUpcomingPayoutLimit.ts b/src/packages/v4v5/hooks/useUpcomingPayoutLimit.ts index a1a476067a..ca761020eb 100644 --- a/src/packages/v4v5/hooks/useUpcomingPayoutLimit.ts +++ b/src/packages/v4v5/hooks/useUpcomingPayoutLimit.ts @@ -1,6 +1,6 @@ import * as constants from '@ethersproject/constants'; -import { NATIVE_TOKEN, jbFundAccessLimitsAbi } from 'juice-sdk-core'; -import { useJBContractContext } from 'juice-sdk-react'; +import { NATIVE_TOKEN, jbFundAccessLimitsAbi } from '@bananapus/nana-sdk-core'; +import { useJBContractContext } from '@bananapus/nana-sdk-react'; import { useReadContract } from 'wagmi'; import { V4V5CurrencyOption } from '../models/v4CurrencyOption'; import { useJBUpcomingRuleset } from './useJBUpcomingRuleset'; diff --git a/src/packages/v4v5/hooks/useUsedPayoutLimitOf.ts b/src/packages/v4v5/hooks/useUsedPayoutLimitOf.ts index 62e39f77e1..a2a8540a3d 100644 --- a/src/packages/v4v5/hooks/useUsedPayoutLimitOf.ts +++ b/src/packages/v4v5/hooks/useUsedPayoutLimitOf.ts @@ -1,9 +1,9 @@ -import { ETH_CURRENCY_ID, NATIVE_TOKEN, jbDirectoryAbi, jbTerminalStoreAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +import { ETH_CURRENCY_ID, NATIVE_TOKEN, jbDirectoryAbi, jbTerminalStoreAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { JBChainId, useJBRulesetContext, useJBTerminalContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { useV4V5Version } from '../contexts/V4V5VersionProvider' @@ -19,7 +19,7 @@ export const useUsedPayoutLimitOf = ({ const { store } = useJBTerminalContext() const { ruleset } = useJBRulesetContext() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const directoryAddress = chainId ? jbContractAddress[versionString][JBCoreContracts.JBDirectory][chainId] : undefined diff --git a/src/packages/v4v5/hooks/useV4V5BalanceOfNativeTerminal.ts b/src/packages/v4v5/hooks/useV4V5BalanceOfNativeTerminal.ts index d39aaf9ae8..86d715648b 100644 --- a/src/packages/v4v5/hooks/useV4V5BalanceOfNativeTerminal.ts +++ b/src/packages/v4v5/hooks/useV4V5BalanceOfNativeTerminal.ts @@ -1,9 +1,9 @@ import { JBChainId, useJBTerminalContext, -} from 'juice-sdk-react'; +} from '@bananapus/nana-sdk-react'; -import { NATIVE_TOKEN, jbDirectoryAbi, jbTerminalStoreAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core'; +import { NATIVE_TOKEN, jbDirectoryAbi, jbTerminalStoreAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core'; import { useReadContract } from 'wagmi'; import { zeroAddress } from 'viem'; import { useV4V5Version } from '../contexts/V4V5VersionProvider'; @@ -12,7 +12,7 @@ export const useV4V5BalanceOfNativeTerminal = ({ chainId, projectId }: { chainId const { store } = useJBTerminalContext(); const { version } = useV4V5Version(); - const versionString = version.toString() as '4' | '5'; + const versionString = version.toString() as '4' | '5' | '6'; const directoryAddress = chainId ? jbContractAddress[versionString][JBCoreContracts.JBDirectory][chainId] : undefined; const { data: terminalAddress } = useReadContract({ diff --git a/src/packages/v4v5/hooks/useV4V5CurrentPayoutSplits.ts b/src/packages/v4v5/hooks/useV4V5CurrentPayoutSplits.ts index ca7f6ba270..967e6b453a 100644 --- a/src/packages/v4v5/hooks/useV4V5CurrentPayoutSplits.ts +++ b/src/packages/v4v5/hooks/useV4V5CurrentPayoutSplits.ts @@ -1,17 +1,17 @@ -import { JBSplit, NATIVE_TOKEN, SplitPortion, jbSplitsAbi, jbTokensAbi, JBCoreContracts, jbContractAddress } from 'juice-sdk-core' +import { JBSplit, NATIVE_TOKEN, SplitPortion, jbSplitsAbi, jbTokensAbi, JBCoreContracts, jbContractAddress } from '@bananapus/nana-sdk-core' import { JBChainId, useJBProjectId, useJBRuleset, useJBContractContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { useV4V5Version } from '../contexts/V4V5VersionProvider' export const useV4V5CurrentPayoutSplits = (chainId?: JBChainId) => { const { projectId } = useJBProjectId(chainId) const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { contractAddress } = useJBContractContext() const { data: tokenAddress } = useReadContract({ diff --git a/src/packages/v4v5/hooks/useV4V5IssueErc20TokenTx.ts b/src/packages/v4v5/hooks/useV4V5IssueErc20TokenTx.ts index e2343467e6..289a0dbae3 100644 --- a/src/packages/v4v5/hooks/useV4V5IssueErc20TokenTx.ts +++ b/src/packages/v4v5/hooks/useV4V5IssueErc20TokenTx.ts @@ -2,8 +2,8 @@ import { useCallback, useContext } from 'react' import { waitForTransactionReceipt } from '@wagmi/core' import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' -import { useJBContractContext } from 'juice-sdk-react' -import { jbControllerAbi, JBChainId } from 'juice-sdk-core' +import { useJBContractContext } from '@bananapus/nana-sdk-react' +import { jbControllerAbi, JBChainId } from '@bananapus/nana-sdk-core' import { useWriteContract, useChainId } from 'wagmi' import { Address, zeroAddress } from 'viem' import { BaseTxOpts } from '../models/transactions' diff --git a/src/packages/v4v5/hooks/useV4V5ProjectOwnerOf.ts b/src/packages/v4v5/hooks/useV4V5ProjectOwnerOf.ts index 43e9239d04..f8e17d7c7e 100644 --- a/src/packages/v4v5/hooks/useV4V5ProjectOwnerOf.ts +++ b/src/packages/v4v5/hooks/useV4V5ProjectOwnerOf.ts @@ -1,5 +1,5 @@ -import { useJBChainId, useJBProjectId } from "juice-sdk-react"; -import { JBChainId, jbProjectsAbi, JBCoreContracts, jbContractAddress } from "juice-sdk-core"; +import { useJBChainId, useJBProjectId } from "@bananapus/nana-sdk-react"; +import { JBChainId, jbProjectsAbi, JBCoreContracts, jbContractAddress } from "@bananapus/nana-sdk-core"; import { useReadContract } from "wagmi"; import { useV4V5Version } from '../contexts/V4V5VersionProvider'; @@ -8,7 +8,7 @@ const useV4V5ProjectOwnerOf = (_chainId?: JBChainId) => { const chainId = _chainId ?? defaultChainId; const { projectId } = useJBProjectId(chainId) const { version } = useV4V5Version(); - const versionString = version.toString() as '4' | '5'; + const versionString = version.toString() as '4' | '5' | '6'; const { data: projectOwnerAddress, isLoading } = useReadContract({ abi: jbProjectsAbi, diff --git a/src/packages/v4v5/hooks/useV4V5ProjectTimeline.ts b/src/packages/v4v5/hooks/useV4V5ProjectTimeline.ts index 5667b4dd03..bd4ea133eb 100644 --- a/src/packages/v4v5/hooks/useV4V5ProjectTimeline.ts +++ b/src/packages/v4v5/hooks/useV4V5ProjectTimeline.ts @@ -1,4 +1,4 @@ -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { getBendystrawClient } from 'lib/apollo/bendystrawClient' import { useProjectQuery, useSuckerGroupTlQuery } from 'generated/v4v5/graphql' import { useMemo } from 'react' diff --git a/src/packages/v4v5/hooks/useV4V5ReservedSplits.ts b/src/packages/v4v5/hooks/useV4V5ReservedSplits.ts index c0a322a91e..c87dc2aad9 100644 --- a/src/packages/v4v5/hooks/useV4V5ReservedSplits.ts +++ b/src/packages/v4v5/hooks/useV4V5ReservedSplits.ts @@ -1,16 +1,16 @@ -import { JBChainId, JBSplit, SplitPortion, jbSplitsAbi, JBCoreContracts, jbContractAddress } from 'juice-sdk-core' +import { JBChainId, JBSplit, SplitPortion, jbSplitsAbi, JBCoreContracts, jbContractAddress } from '@bananapus/nana-sdk-core' import { useJBProjectId, useJBRuleset, useJBUpcomingRuleset, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { useV4V5Version } from '../contexts/V4V5VersionProvider' const RESERVED_SPLITS_GROUP_ID = 1n export const useV4V5ReservedSplits = (chainId?: JBChainId) => { const { projectId } = useJBProjectId(chainId) const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { ruleset } = useJBRuleset({ projectId, chainId, diff --git a/src/packages/v4v5/hooks/useV4V5TotalTokenSupply.ts b/src/packages/v4v5/hooks/useV4V5TotalTokenSupply.ts index 40e8f01026..f4148bd7f2 100644 --- a/src/packages/v4v5/hooks/useV4V5TotalTokenSupply.ts +++ b/src/packages/v4v5/hooks/useV4V5TotalTokenSupply.ts @@ -1,5 +1,5 @@ -import { useJBContractContext } from 'juice-sdk-react'; -import { jbControllerAbi } from 'juice-sdk-core'; +import { useJBContractContext } from '@bananapus/nana-sdk-react'; +import { jbControllerAbi } from '@bananapus/nana-sdk-core'; import { useReadContract } from 'wagmi'; export const useV4V5TotalTokenSupply = () => { diff --git a/src/packages/v4v5/hooks/useV4V5UpcomingPayoutSplits.ts b/src/packages/v4v5/hooks/useV4V5UpcomingPayoutSplits.ts index ac7caade55..9847933ed9 100644 --- a/src/packages/v4v5/hooks/useV4V5UpcomingPayoutSplits.ts +++ b/src/packages/v4v5/hooks/useV4V5UpcomingPayoutSplits.ts @@ -1,8 +1,8 @@ -import { JBSplit, NATIVE_TOKEN, SplitPortion, jbSplitsAbi, jbTokensAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +import { JBSplit, NATIVE_TOKEN, SplitPortion, jbSplitsAbi, jbTokensAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { JBChainId, useJBProjectId, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { useV4V5Version } from '../contexts/V4V5VersionProvider' @@ -11,7 +11,7 @@ import { useJBUpcomingRuleset } from './useJBUpcomingRuleset' export const useV4V5UpcomingPayoutSplits = (chainId?: JBChainId) => { const { projectId } = useJBProjectId(chainId) const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { ruleset: upcomingRuleset, isLoading: upcomingRulesetLoading } = useJBUpcomingRuleset(chainId) diff --git a/src/packages/v4v5/hooks/useV4V5WalletHasPermission.ts b/src/packages/v4v5/hooks/useV4V5WalletHasPermission.ts index 07c64823ee..21fe8061be 100644 --- a/src/packages/v4v5/hooks/useV4V5WalletHasPermission.ts +++ b/src/packages/v4v5/hooks/useV4V5WalletHasPermission.ts @@ -1,8 +1,8 @@ import { useJBChainId, useJBContractContext, -} from 'juice-sdk-react' -import { jbPermissionsAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbPermissionsAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import { useGnosisSafe } from 'hooks/safe/useGnosisSafe' @@ -29,7 +29,7 @@ export function useV4V5WalletHasPermission( const _operator = userAddress ?? zeroAddress const _account = projectOwnerAddress ?? zeroAddress - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const permissionsAddress = chainId ? jbContractAddress[versionString][JBCoreContracts.JBPermissions][chainId as unknown as keyof typeof jbContractAddress[typeof versionString][JBCoreContracts.JBPermissions]] : undefined const hasOperatorPermission = useReadContract({ diff --git a/src/packages/v4v5/models/nfts.ts b/src/packages/v4v5/models/nfts.ts index f84f9eba76..d6d7f08dd0 100644 --- a/src/packages/v4v5/models/nfts.ts +++ b/src/packages/v4v5/models/nfts.ts @@ -1,4 +1,4 @@ -import { JBRulesetData, JBRulesetMetadata, jb721TiersHookStoreAbi } from 'juice-sdk-core' +import { JBRulesetData, JBRulesetMetadata, jb721TiersHookStoreAbi } from '@bananapus/nana-sdk-core' import { JB721GovernanceType, NftCollectionMetadata, NftRewardTier } from 'models/nftRewards' import { Address, ContractFunctionReturnType } from 'viem' import { NftPricingContext } from 'packages/v2v3/hooks/JB721Delegate/contractReader/useNftCollectionPricingContext' diff --git a/src/packages/v4v5/models/splits.ts b/src/packages/v4v5/models/splits.ts index 7e5fb0e075..690d5f4d7d 100644 --- a/src/packages/v4v5/models/splits.ts +++ b/src/packages/v4v5/models/splits.ts @@ -1,4 +1,4 @@ -import { JBSplit } from "juice-sdk-core" +import { JBSplit } from "@bananapus/nana-sdk-core" export interface GroupedSplits { groupId: G diff --git a/src/packages/v4v5/utils/approvalHooks.ts b/src/packages/v4v5/utils/approvalHooks.ts index f3b9f6566e..1631a456e3 100644 --- a/src/packages/v4v5/utils/approvalHooks.ts +++ b/src/packages/v4v5/utils/approvalHooks.ts @@ -5,7 +5,7 @@ import { } from 'constants/numbers' import { t } from '@lingui/macro' -import { JBChainId, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +import { JBChainId, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { ApprovalHook } from 'models/approvalHooks' import { durationBallotStrategyDescription } from 'packages/v2v3/constants/ballotStrategies' import { isEqualAddress } from 'utils/address' @@ -26,27 +26,29 @@ export const getDefaultCreateFlowChainId = (): JBChainId => { * This ensures we get the correct addresses per chain and is future-proof * against potential SDK changes where addresses might differ per chain. */ -const getApprovalHookAddresses = (version: 4 | 5, chainId: JBChainId) => { +const getApprovalHookAddresses = (version: 4 | 5 | 6, chainId: JBChainId) => { const chainIdKey = String( chainId, ) as keyof (typeof jbContractAddress)['4'][JBCoreContracts.JBDeadline1Day] return { oneDay: - jbContractAddress[String(version) as '4' | '5'][ + jbContractAddress[String(version) as '4' | '5' | '6'][ JBCoreContracts.JBDeadline1Day ][chainIdKey], threeDay: - jbContractAddress[String(version) as '4' | '5'][ + jbContractAddress[String(version) as '4' | '5' | '6'][ JBCoreContracts.JBDeadline3Days ][chainIdKey], sevenDay: - jbContractAddress[String(version) as '4' | '5'][ + jbContractAddress[String(version) as '4' | '5' | '6'][ JBCoreContracts.JBDeadline7Days ][chainIdKey], threeHour: - version === 5 - ? jbContractAddress['5'][JBCoreContracts.JBDeadline3Hours][chainIdKey] + version >= 5 + ? jbContractAddress[String(version) as '5' | '6'][ + JBCoreContracts.JBDeadline3Hours + ][chainIdKey] : undefined, } } @@ -62,7 +64,7 @@ const getApprovalHookAddresses = (version: 4 | 5, chainId: JBChainId) => { * @param chainId - Optional chainId. If not provided, defaults to environment-based chainId for Create flow */ export const getAvailableApprovalStrategies = ( - version: 4 | 5, + version: 4 | 5 | 6, chainId?: JBChainId, ): ApprovalHook[] => { const resolvedChainId = chainId ?? getDefaultCreateFlowChainId() @@ -142,7 +144,7 @@ export const createCustomApprovalStrategy = ( */ export const getApprovalStrategyByAddress = ( address: string, - version: 4 | 5, + version: 4 | 5 | 6, chainId?: JBChainId, ): ApprovalHook => { const resolvedChainId = chainId ?? getDefaultCreateFlowChainId() diff --git a/src/packages/v4v5/utils/contractVersion.ts b/src/packages/v4v5/utils/contractVersion.ts index 90dd02cc30..f68ccb9f14 100644 --- a/src/packages/v4v5/utils/contractVersion.ts +++ b/src/packages/v4v5/utils/contractVersion.ts @@ -2,6 +2,6 @@ * Utility for getting contract version string * Converts numeric version (4 or 5) to string for jbContractAddress lookup */ -export function getContractVersionString(version: 4 | 5): '4' | '5' { - return version.toString() as '4' | '5' +export function getContractVersionString(version: 4 | 5 | 6): '4' | '5' | '6' { + return version.toString() as '4' | '5' | '6' } \ No newline at end of file diff --git a/src/packages/v4v5/utils/currency.ts b/src/packages/v4v5/utils/currency.ts index 1dcab640c5..98909b1c83 100644 --- a/src/packages/v4v5/utils/currency.ts +++ b/src/packages/v4v5/utils/currency.ts @@ -11,7 +11,7 @@ import { } from '../models/v4CurrencyOption' import { V2V3CurrencyOption } from 'packages/v2v3/models/currencyOption' -import { USD_CURRENCY_ID } from 'juice-sdk-core' +import { USD_CURRENCY_ID } from '@bananapus/nana-sdk-core' export const V4V5_CURRENCY_ETH: V4V5CurrencyETH = 1 @@ -20,7 +20,7 @@ export const V4V5_CURRENCY_ETH: V4V5CurrencyETH = 1 * V4: USD = 3 (due to botched price feed at index 2) * V5: USD = 2 */ -export const getV4V5CurrencyUSD = (version: 4 | 5): V4V5CurrencyUSD => { +export const getV4V5CurrencyUSD = (version: 4 | 5 | 6): V4V5CurrencyUSD => { return USD_CURRENCY_ID(version) } @@ -52,7 +52,7 @@ export const V4V5CurrencyName = ( */ export const getV4V5CurrencyOption = ( currencyName: CurrencyName, - version: 4 | 5, + version: 4 | 5 | 6, ): V4V5CurrencyOption => currencyName === 'ETH' ? V4V5_CURRENCY_ETH : getV4V5CurrencyUSD(version) @@ -67,7 +67,7 @@ export const convertV4V5CurrencyOptionToV2V3 = (v4CurrencyOption: V4V5CurrencyOp export const convertV2V3CurrencyOptionToV4V5 = ( v2v3CurrencyOption: V2V3CurrencyOption, - version: 4 | 5, + version: 4 | 5 | 6, ): V4V5CurrencyOption => { if (v2v3CurrencyOption === V2V3_CURRENCY_ETH) { return V4V5_CURRENCY_ETH diff --git a/src/packages/v4v5/utils/distributions.ts b/src/packages/v4v5/utils/distributions.ts index f78c4b275b..5bcbdb3027 100644 --- a/src/packages/v4v5/utils/distributions.ts +++ b/src/packages/v4v5/utils/distributions.ts @@ -4,7 +4,7 @@ import { JBSplit as Split, SplitPortion, SPLITS_TOTAL_PERCENT, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import round from 'lodash/round' import { fromWad, parseWad } from 'utils/format/formatNumber' import { isInfinitePayoutLimit } from './fundingCycle' diff --git a/src/packages/v4v5/utils/editRuleset.ts b/src/packages/v4v5/utils/editRuleset.ts index d6b6a79f29..0a756e2eea 100644 --- a/src/packages/v4v5/utils/editRuleset.ts +++ b/src/packages/v4v5/utils/editRuleset.ts @@ -1,4 +1,4 @@ -import { ETH_CURRENCY_ID, JBChainId, NATIVE_TOKEN } from 'juice-sdk-core' +import { ETH_CURRENCY_ID, JBChainId, NATIVE_TOKEN } from '@bananapus/nana-sdk-core' import round from 'lodash/round' import { issuanceRateFrom } from 'packages/v2v3/utils/math' @@ -34,6 +34,7 @@ export type EditCycleTxArgs = readonly [ ownerMustSendPayouts: boolean holdFees: boolean useTotalSurplusForCashOuts: boolean + scopeCashOutsToLocalBalances: boolean useDataHookForPay: boolean useDataHookForCashOut: boolean dataHook: `0x${string}` @@ -82,7 +83,7 @@ export function transformEditCycleFormFieldsToTxArgs({ dataHook: `0x${string}` projectId: bigint chainId: JBChainId - version: 4 | 5 + version: 4 | 5 | 6 }): EditCycleTxArgs { const now = round(new Date().getTime() / 1000) @@ -132,7 +133,8 @@ export function transformEditCycleFormFieldsToTxArgs({ allowAddPriceFeed: false, // Defaulting to false as it's not in formValues ownerMustSendPayouts: false, // Defaulting to false as it's not in formValues holdFees: formValues.holdFees, - useTotalSurplusForCashOuts: false, // Defaulting to false as it's not in formValues + useTotalSurplusForCashOuts: false, // Defaulting to false as it's not in formValues. Read by v4/v5 ABIs. + scopeCashOutsToLocalBalances: true, // v6 renamed the flag with inverted meaning; must stay the negation of useTotalSurplusForCashOuts. Read by the v6 ABI. useDataHookForPay: useDataHookForPayValue, useDataHookForCashOut: false, // Defaulting to false as it's not in formValues dataHook, // doesn't change in edit ruleset diff --git a/src/packages/v4v5/utils/estimateOmnichainGas.ts b/src/packages/v4v5/utils/estimateOmnichainGas.ts index 540a582749..e246c54523 100644 --- a/src/packages/v4v5/utils/estimateOmnichainGas.ts +++ b/src/packages/v4v5/utils/estimateOmnichainGas.ts @@ -1,6 +1,6 @@ import { Abi, Address, Client, encodeFunctionData, PublicClient, Transport } from 'viem' import { estimateGas } from 'viem/actions' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { wagmiConfig } from 'contexts/Para/Providers' import { Chain } from 'viem/chains' diff --git a/src/packages/v4v5/utils/launchProjectTransformers.ts b/src/packages/v4v5/utils/launchProjectTransformers.ts index d378f961cc..b54e8ad4b9 100644 --- a/src/packages/v4v5/utils/launchProjectTransformers.ts +++ b/src/packages/v4v5/utils/launchProjectTransformers.ts @@ -2,12 +2,13 @@ import { ETH_CURRENCY_ID, jbContractAddress, JBCoreContracts, + JBRouterTerminalContracts, JBSplit, NATIVE_TOKEN, NATIVE_TOKEN_DECIMALS, SplitGroup, SplitPortion, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { V2V3FundAccessConstraint, @@ -52,7 +53,7 @@ export function transformV2V3CreateArgsToV4({ v2v3Args: LaunchV2V3ProjectArgs primaryNativeTerminal: Address currencyTokenAddress: Address - version: 4 | 5 + version: 4 | 5 | 6 chainId: number }) { const [ @@ -77,26 +78,33 @@ export function transformV2V3CreateArgsToV4({ const now = round(new Date().getTime() / 1000) - // Map v4 approval hooks to their v5 equivalents when version is 5 + // Map approval hooks from other versions to the target version's equivalents const ballotAddress = _fundingCycleData.ballot?.toLowerCase() let approvalHook = _fundingCycleData.ballot as Address - if (version === 5 && ballotAddress) { + if (version >= 5 && ballotAddress) { const chainIdKey = String( chainId, ) as keyof (typeof jbContractAddress)['4'][JBCoreContracts.JBDeadline1Day] + const versionKey = String(version) as '5' | '6' - // Check if ballot is a v4 approval hook and map to v5 - const v4Hooks: Record = { - [jbContractAddress['4'][JBCoreContracts.JBDeadline1Day][chainIdKey]]: - jbContractAddress['5'][JBCoreContracts.JBDeadline1Day][chainIdKey], - [jbContractAddress['4'][JBCoreContracts.JBDeadline3Days][chainIdKey]]: - jbContractAddress['5'][JBCoreContracts.JBDeadline3Days][chainIdKey], - [jbContractAddress['4'][JBCoreContracts.JBDeadline7Days][chainIdKey]]: - jbContractAddress['5'][JBCoreContracts.JBDeadline7Days][chainIdKey], + // Check if ballot is another version's approval hook and map to this version's + const hookMap: Record = {} + for (const deadline of [ + JBCoreContracts.JBDeadline1Day, + JBCoreContracts.JBDeadline3Days, + JBCoreContracts.JBDeadline7Days, + ] as const) { + const target = jbContractAddress[versionKey][deadline][chainIdKey] + for (const sourceVersion of ['4', '5'] as const) { + if (sourceVersion === versionKey) continue + hookMap[ + jbContractAddress[sourceVersion][deadline][chainIdKey].toLowerCase() + ] = target + } } - approvalHook = (v4Hooks[ballotAddress] as Address) ?? approvalHook + approvalHook = (hookMap[ballotAddress] as Address) ?? approvalHook } const ruleset = { @@ -131,6 +139,21 @@ export function transformV2V3CreateArgsToV4({ currencyTokenAddress, }) + // v6 replaces the swap terminal with the router terminal registry: register it with empty + // accounting contexts so the project can accept any token (it swaps into the accounting token). + if (version === 6) { + const chainIdKey = String( + chainId, + ) as keyof (typeof jbContractAddress)['6'][JBRouterTerminalContracts.JBRouterTerminalRegistry] + terminalConfigurations.push({ + terminal: + jbContractAddress['6'][ + JBRouterTerminalContracts.JBRouterTerminalRegistry + ][chainIdKey], + accountingContextsToAccept: [], + }) + } + const result = [ _owner as Address, _projectMetadata[0], // Just the CID string @@ -165,6 +188,10 @@ export function transformFCMetadataToRulesetMetadata({ holdFees: fundingCycleMetadata.holdFees, useTotalSurplusForCashOuts: fundingCycleMetadata.useTotalOverflowForRedemptions, + // v6 renamed the flag above with INVERTED semantics. Both keys are set so the same + // object encodes correctly under the v4/v5 and v6 ABIs (viem picks fields by name). + scopeCashOutsToLocalBalances: + !fundingCycleMetadata.useTotalOverflowForRedemptions, useDataHookForPay: fundingCycleMetadata.useDataSourceForPay, useDataHookForCashOut: fundingCycleMetadata.useDataSourceForRedeem, dataHook: fundingCycleMetadata.dataSource as Address, @@ -209,7 +236,7 @@ export function transformV2V3FundAccessConstraintsToV4({ v2V3FundAccessConstraints: V2V3FundAccessConstraint[] primaryNativeTerminal: Address currencyTokenAddress: Address - version: 4 | 5 + version: 4 | 5 | 6 }): FundAccessLimitGroup[] { return v2V3FundAccessConstraints.map(constraint => ({ terminal: primaryNativeTerminal as `0x${string}`, diff --git a/src/packages/v4v5/utils/networks.ts b/src/packages/v4v5/utils/networks.ts index a5960e23e8..fcaad10bb8 100644 --- a/src/packages/v4v5/utils/networks.ts +++ b/src/packages/v4v5/utils/networks.ts @@ -1,5 +1,5 @@ import { TESTNET_IDS } from 'constants/networks' -import { JB_CHAINS, JBChainId } from 'juice-sdk-core' +import { JB_CHAINS, JBChainId } from '@bananapus/nana-sdk-core' export function getChainName(chainId: number) { return JB_CHAINS[chainId as JBChainId].name diff --git a/src/packages/v4v5/utils/routes.ts b/src/packages/v4v5/utils/routes.ts index c48089cba4..44f9b8e5c3 100644 --- a/src/packages/v4v5/utils/routes.ts +++ b/src/packages/v4v5/utils/routes.ts @@ -23,6 +23,17 @@ export const v5ProjectRoute = ({ return `/v5/${chainSlug}:${projectId?.toString()}` } +export const v6ProjectRoute = ({ + chainId, + projectId, +}: { + chainId: number + projectId?: number +}) => { + const chainSlug = getChainSlug(chainId) + return `/v6/${chainSlug}:${projectId?.toString()}` +} + export const v4v5ProjectRoute = ({ chainId, projectId, @@ -30,7 +41,7 @@ export const v4v5ProjectRoute = ({ }: { chainId: number projectId?: number - version: 4 | 5 + version: 4 | 5 | 6 }) => { const chainSlug = getChainSlug(chainId) return `/v${version}/${chainSlug}:${projectId?.toString()}` @@ -44,7 +55,7 @@ export const settingsPagePath = ( }: { projectId: number chainId: number - version?: 4 | 5 + version?: 4 | 5 | 6 }, settingsPage?: SettingsPageKey, ) => { diff --git a/src/packages/v4v5/utils/rulesetDiff.ts b/src/packages/v4v5/utils/rulesetDiff.ts index dd099962e6..7985ef93fa 100644 --- a/src/packages/v4v5/utils/rulesetDiff.ts +++ b/src/packages/v4v5/utils/rulesetDiff.ts @@ -1,4 +1,4 @@ -import { JBChainId, JBRulesetData, JBRulesetMetadata } from "juice-sdk-core"; +import { JBChainId, JBRulesetData, JBRulesetMetadata } from "@bananapus/nana-sdk-core"; export function getDiffedAttrBetweenRulesets(rulesetsByChain: Record( defaultChainId, diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5ExportPayoutsCsvItem.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5ExportPayoutsCsvItem.tsx index cde665134a..1019022e5e 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5ExportPayoutsCsvItem.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5ExportPayoutsCsvItem.tsx @@ -1,7 +1,7 @@ import { ArrowUpTrayIcon } from '@heroicons/react/24/outline' import { Trans, t } from '@lingui/macro' import { Button, Tooltip } from 'antd' -import { useJBProjectId, useJBRuleset } from 'juice-sdk-react' +import { useJBProjectId, useJBRuleset } from '@bananapus/nana-sdk-react' import { twMerge } from 'tailwind-merge' import { useV4V5CurrentUpcomingPayoutSplits } from './hooks/useV4V5CurrentUpcomingPayoutSplits' import { useV4V5ExportSplitsToCsv } from './hooks/useV4V5ExportSplitsToCsv' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5PayoutsSubPanel.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5PayoutsSubPanel.tsx index d324b15913..4c85c9cf23 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5PayoutsSubPanel.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/V4V5PayoutsSubPanel.tsx @@ -6,7 +6,7 @@ import { availableToPayOutTooltip } from 'components/Project/ProjectTabs/CyclesP import { TitleDescriptionDisplayCard } from 'components/Project/ProjectTabs/TitleDescriptionDisplayCard' import { TruncatedText } from 'components/TruncatedText' import { NETWORKS } from 'constants/networks' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' import React from 'react' import { twMerge } from 'tailwind-merge' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/components/RulesetDiffSection.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/components/RulesetDiffSection.tsx index 5214c8f449..a0f162691e 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/components/RulesetDiffSection.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/components/RulesetDiffSection.tsx @@ -1,7 +1,7 @@ import { Disclosure, Transition } from '@headlessui/react' import { ChevronDownIcon } from '@heroicons/react/24/outline' import { Trans, t } from '@lingui/macro' -import { JBRulesetData, JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetData, JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { Fragment, useMemo } from 'react' import { twMerge } from 'tailwind-merge' import { formattedNum } from 'utils/format/formatNumber' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedChainContext.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedChainContext.tsx index 90abb08c5f..fde9d83d64 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedChainContext.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedChainContext.tsx @@ -1,4 +1,4 @@ -import { JBChainId, useJBChainId } from 'juice-sdk-react' +import { JBChainId, useJBChainId } from '@bananapus/nana-sdk-react' import { createContext, useContext, useEffect, useState } from 'react' type CyclesPanelSelectedChainContextType = { diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedCycleContext.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedCycleContext.tsx index 0a9a27c3b5..4cbe558d5d 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedCycleContext.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/CyclesPanelSelectedCycleContext.tsx @@ -1,4 +1,4 @@ -import { JBRulesetData, JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetData, JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { createContext, useContext } from 'react' import { CycleOption, diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/ReservedTokensSelectedChainContext.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/ReservedTokensSelectedChainContext.tsx index e78dab5b3a..8e7521f82c 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/ReservedTokensSelectedChainContext.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/contexts/ReservedTokensSelectedChainContext.tsx @@ -1,4 +1,4 @@ -import { JBChainId, useJBChainId } from 'juice-sdk-react' +import { JBChainId, useJBChainId } from '@bananapus/nana-sdk-react' import { createContext, useContext, useEffect } from 'react' import { useState } from 'react' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5CycleConfigurationPanel.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5CycleConfigurationPanel.ts index 1b356b7f5c..8b48e8d1e2 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5CycleConfigurationPanel.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5CycleConfigurationPanel.ts @@ -1,4 +1,4 @@ -import { JBRulesetData, JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetData, JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { useV4V5FormatCycleSection } from './useV4V5FormatCycleSection' import { useV4V5FormatTokenSection } from './useV4V5FormatTokenSection' import { useV4V5FormatOtherRulesSection } from './useV4V5FormatOtherRulesSection' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5DistributableAmount.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5DistributableAmount.ts index e0d2d4ea00..a33f6a238a 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5DistributableAmount.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5DistributableAmount.ts @@ -1,6 +1,6 @@ import { useCurrencyConverter } from 'hooks/useCurrencyConverter' -import { JBProjectToken } from 'juice-sdk-core' -import { JBChainId } from 'juice-sdk-react' +import { JBProjectToken } from '@bananapus/nana-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-react' import { usePayoutLimitOfChain } from 'packages/v4v5/hooks/usePayoutLimitOfChain' import { useUsedPayoutLimitOf } from 'packages/v4v5/hooks/useUsedPayoutLimitOf' import { useV4V5BalanceOfNativeTerminal } from 'packages/v4v5/hooks/useV4V5BalanceOfNativeTerminal' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5ExportSplitsToCsv.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5ExportSplitsToCsv.ts index 3d63c4c3ef..7f385c53b1 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5ExportSplitsToCsv.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5ExportSplitsToCsv.ts @@ -1,6 +1,6 @@ import { t } from '@lingui/macro' -import { JBSplit } from 'juice-sdk-core' -import { useJBContractContext } from 'juice-sdk-react' +import { JBSplit } from '@bananapus/nana-sdk-core' +import { useJBContractContext } from '@bananapus/nana-sdk-react' import useV4V5ProjectOwnerOf from 'packages/v4v5/hooks/useV4V5ProjectOwnerOf' import { v4GetProjectOwnerRemainderSplit } from 'packages/v4v5/utils/v4Splits' import { useState } from 'react' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationCycleSection.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationCycleSection.tsx index c25cf225dc..dd1e595fcb 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationCycleSection.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationCycleSection.tsx @@ -3,8 +3,8 @@ import { AmountInCurrency } from 'components/currency/AmountInCurrency' import { ConfigurationPanelDatum } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { pairToDatum } from 'components/Project/ProjectTabs/utils/pairToDatum' import { BigNumber } from 'ethers' -import { JBRulesetData } from 'juice-sdk-core' -import { useJBChainId } from 'juice-sdk-react' +import { JBRulesetData } from '@bananapus/nana-sdk-core' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { V4V5CurrencyOption } from 'packages/v4v5/models/v4CurrencyOption' import { getApprovalStrategyByAddress } from 'packages/v4v5/utils/approvalHooks' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationExtensionSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationExtensionSection.ts index 530d6bd1a1..0753112959 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationExtensionSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationExtensionSection.ts @@ -5,7 +5,7 @@ import { } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { flagPairToDatum } from 'components/Project/ProjectTabs/utils/flagPairToDatum' import { pairToDatum } from 'components/Project/ProjectTabs/utils/pairToDatum' -import { JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { useMemo } from 'react' import { isZeroAddress } from 'utils/address' import { etherscanLink } from 'utils/etherscan' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationOtherRulesSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationOtherRulesSection.ts index 34a78afb7d..dffd74db4d 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationOtherRulesSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationOtherRulesSection.ts @@ -4,7 +4,7 @@ import { ConfigurationPanelTableData, } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { flagPairToDatum } from 'components/Project/ProjectTabs/utils/flagPairToDatum' -import { JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { useMemo } from 'react' export const useV4V5FormatConfigurationOtherRulesSection = ({ diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationTokenSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationTokenSection.ts index e2cd5c2a86..5cf2329a43 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationTokenSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatConfigurationTokenSection.ts @@ -2,7 +2,7 @@ import { ConfigurationPanelDatum, ConfigurationPanelTableData, } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' -import { ETH_CURRENCY_ID, JBRulesetData, JBRulesetMetadata } from 'juice-sdk-core' +import { ETH_CURRENCY_ID, JBRulesetData, JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { flagPairToDatum } from 'components/Project/ProjectTabs/utils/flagPairToDatum' import { formattedNum } from 'utils/format/formatNumber' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatCycleSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatCycleSection.ts index 6f3d7bd0b4..c5dafb903f 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatCycleSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatCycleSection.ts @@ -1,8 +1,8 @@ import { t } from '@lingui/macro' import { ConfigurationPanelTableData } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { pairToDatum } from 'components/Project/ProjectTabs/utils/pairToDatum' -import { JBRulesetData } from 'juice-sdk-core' -import { useJBChainId } from 'juice-sdk-react' +import { JBRulesetData } from '@bananapus/nana-sdk-core' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { getApprovalStrategyByAddress } from 'packages/v4v5/utils/approvalHooks' import { useMemo } from 'react' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatExtensionSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatExtensionSection.ts index eea50bd47b..10e7d6d77a 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatExtensionSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatExtensionSection.ts @@ -2,7 +2,7 @@ import { t } from '@lingui/macro' import { ConfigurationPanelTableData } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { flagPairToDatum } from 'components/Project/ProjectTabs/utils/flagPairToDatum' import { pairToDatum } from 'components/Project/ProjectTabs/utils/pairToDatum' -import { JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { useMemo } from 'react' import { isZeroAddress } from 'utils/address' import { etherscanLink } from 'utils/etherscan' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatOtherRulesSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatOtherRulesSection.ts index 10533f2c73..a2ecb62447 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatOtherRulesSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatOtherRulesSection.ts @@ -1,7 +1,7 @@ import { t } from '@lingui/macro' import { ConfigurationPanelTableData } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { flagPairToDatum } from 'components/Project/ProjectTabs/utils/flagPairToDatum' -import { JBRulesetMetadata } from 'juice-sdk-core' +import { JBRulesetMetadata } from '@bananapus/nana-sdk-core' import { useMemo } from 'react' export const useV4V5FormatOtherRulesSection = ( diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatTokenSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatTokenSection.ts index 34b3530f23..46d5eaa62c 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatTokenSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5FormatTokenSection.ts @@ -4,8 +4,8 @@ import { } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { flagPairToDatum } from 'components/Project/ProjectTabs/utils/flagPairToDatum' import { pairToDatum } from 'components/Project/ProjectTabs/utils/pairToDatum' -import { ETH_CURRENCY_ID, JBRulesetData, JBRulesetMetadata } from 'juice-sdk-core' -import { useJBTokenContext } from 'juice-sdk-react' +import { ETH_CURRENCY_ID, JBRulesetData, JBRulesetMetadata } from '@bananapus/nana-sdk-core' +import { useJBTokenContext } from '@bananapus/nana-sdk-react' import { useMemo } from 'react' import { formattedNum } from 'utils/format/formatNumber' import { tokenSymbolText } from 'utils/tokenSymbolText' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5PayoutsSubPanel.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5PayoutsSubPanel.tsx index 55f2cab7be..2041f06773 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5PayoutsSubPanel.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5PayoutsSubPanel.tsx @@ -1,6 +1,7 @@ -import { JBSplit, SPLITS_TOTAL_PERCENT, jbMultiTerminalAbi, JBCoreContracts } from 'juice-sdk-core' +import { JBSplit, SPLITS_TOTAL_PERCENT, JBCoreContracts } from '@bananapus/nana-sdk-core' +import { useTerminalFee } from 'packages/v4v5/hooks/useTerminalFee' import { useCallback, useMemo } from 'react' -import { useJBChainId, useJBContractContext } from 'juice-sdk-react' +import { useJBChainId, useJBContractContext } from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { AmountInCurrency } from 'components/currency/AmountInCurrency' @@ -40,11 +41,7 @@ export const useV4V5PayoutsSubPanel = (type: 'current' | 'upcoming') => { const { contractAddress } = useJBContractContext() const terminalAddress = contractAddress(JBCoreContracts.JBMultiTerminal) - const { data: primaryNativeTerminalFee } = useReadContract({ - abi: jbMultiTerminalAbi, - address: terminalAddress, - functionName: 'FEE', - }) + const primaryNativeTerminalFee = useTerminalFee() const { projectId } = useJBContractContext() const chainId = useJBChainId() diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TokenSection.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TokenSection.ts index c4d1819e4b..e23c566942 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TokenSection.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TokenSection.ts @@ -1,4 +1,4 @@ -import { useJBTokenContext } from 'juice-sdk-react' +import { useJBTokenContext } from '@bananapus/nana-sdk-react' import { ConfigurationPanelTableData } from 'components/Project/ProjectTabs/CyclesPayoutsTab/ConfigurationPanel' import { useJBRulesetByChain } from 'packages/v4v5/hooks/useJBRulesetByChain' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TreasuryStats.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TreasuryStats.tsx index 87928d482c..c0566470d8 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TreasuryStats.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5CyclesPayoutsPanel/hooks/useV4V5TreasuryStats.tsx @@ -5,7 +5,7 @@ import { useJBRulesetMetadata, useSuckersNativeTokenBalance, useSuckersNativeTokenSurplus -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { BigNumber } from '@ethersproject/bignumber' import { Tooltip } from 'antd' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/NftDetails.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/NftDetails.tsx index 25fb8ab353..ba746a9f9c 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/NftDetails.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/NftDetails.tsx @@ -1,7 +1,7 @@ import { Skeleton } from 'antd' import ETHAmount from 'components/currency/ETHAmount' import { TruncatedText } from 'components/TruncatedText' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { NftRewardTier } from 'models/nftRewards' import { twMerge } from 'tailwind-merge' import { parseWad } from 'utils/format/formatNumber' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/RemainingSupplyWithTooltip.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/RemainingSupplyWithTooltip.tsx index c5d60ac535..04b49c1b5e 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/RemainingSupplyWithTooltip.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/NftReward/RemainingSupplyWithTooltip.tsx @@ -2,7 +2,7 @@ import { Trans, t } from '@lingui/macro' import { Tooltip } from 'antd' import { NETWORKS } from 'constants/networks' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { DEFAULT_NFT_MAX_SUPPLY } from 'packages/v2v3/constants/nftRewards' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ClaimTokensModal.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ClaimTokensModal.tsx index 98bd40367b..0ea3cb8a3e 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ClaimTokensModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ClaimTokensModal.tsx @@ -1,13 +1,13 @@ import { Trans, t } from '@lingui/macro' import { Descriptions, Form } from 'antd' -import { Ether, JBChainId } from 'juice-sdk-core' +import { Ether, JBChainId } from '@bananapus/nana-sdk-core' import { useJBChainId, useJBProjectId, useJBTokenContext, useSuckers, -} from 'juice-sdk-react' -import { jbDirectoryAbi, jbTokensAbi, jbControllerAbi, JBCoreContracts, jbContractAddress } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbDirectoryAbi, jbTokensAbi, jbControllerAbi, JBCoreContracts, jbContractAddress } from '@bananapus/nana-sdk-core' import { useReadContract, useWriteContract } from 'wagmi' import { useContext, useEffect, useLayoutEffect, useState } from 'react' import { fromWad, parseWad } from 'utils/format/formatNumber' @@ -41,7 +41,7 @@ export function V4V5ClaimTokensModal({ }) { const { addTransaction } = useContext(TxHistoryContext) const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { token } = useJBTokenContext() const { userAddress, changeNetworks } = useWallet() diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5DistributeReservedTokensModal.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5DistributeReservedTokensModal.tsx index 8b9ddc0653..25fedca7c2 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5DistributeReservedTokensModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5DistributeReservedTokensModal.tsx @@ -1,8 +1,8 @@ -import { JBChainId, formatEther } from 'juice-sdk-core' +import { JBChainId, formatEther } from '@bananapus/nana-sdk-core' import { Trans, t } from '@lingui/macro' import { useContext, useEffect, useState } from 'react' -import { useJBProjectId, useJBTokenContext, useSuckers } from 'juice-sdk-react' -import { jbControllerAbi, jbDirectoryAbi, JBCoreContracts, jbContractAddress } from 'juice-sdk-core' +import { useJBProjectId, useJBTokenContext, useSuckers } from '@bananapus/nana-sdk-react' +import { jbControllerAbi, jbDirectoryAbi, JBCoreContracts, jbContractAddress } from '@bananapus/nana-sdk-core' import { useReadContract, useWriteContract } from 'wagmi' import { ChainSelect } from 'packages/v4v5/components/ChainSelect' @@ -32,7 +32,7 @@ export default function V4V5DistributeReservedTokensModal({ }) { const { addTransaction } = useContext(TxHistoryContext) const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' // Chain selection state - separate from the hook's chain const [selectedChainId, setSelectedChainId] = useState(defaultChainId) diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ExportReservedTokensCsvItem.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ExportReservedTokensCsvItem.tsx index 78279b06b5..1427456c42 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ExportReservedTokensCsvItem.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ExportReservedTokensCsvItem.tsx @@ -1,6 +1,6 @@ import { ArrowUpTrayIcon } from '@heroicons/react/24/outline' import { Trans } from '@lingui/macro' -import { useJBProjectId, useJBRuleset } from 'juice-sdk-react' +import { useJBProjectId, useJBRuleset } from '@bananapus/nana-sdk-react' import { useV4V5ReservedSplits } from 'packages/v4v5/hooks/useV4V5ReservedSplits' import { useV4V5ExportSplitsToCsv } from '../V4V5CyclesPayoutsPanel/hooks/useV4V5ExportSplitsToCsv' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5MintModal.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5MintModal.tsx index dbd9d846d3..59b0f475f1 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5MintModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5MintModal.tsx @@ -5,8 +5,8 @@ import { useJBProjectId, useJBContractContext, useSuckers, -} from 'juice-sdk-react' -import { jbDirectoryAbi, jbTokensAbi, jbControllerAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbDirectoryAbi, jbTokensAbi, jbControllerAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract, useWriteContract } from 'wagmi' import { useContext, useState } from 'react' @@ -47,7 +47,7 @@ export function V4V5MintModal({ const { writeContractAsync: writeMintTokens } = useWriteContract() const [form] = useForm() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const [loading, setLoading] = useState() const [transactionPending, setTransactionPending] = useState() diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ReservedTokensSubPanel.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ReservedTokensSubPanel.tsx index 052b0b682b..0a57bc3eab 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ReservedTokensSubPanel.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5ReservedTokensSubPanel.tsx @@ -8,7 +8,7 @@ import { V4V5ProjectAllocationRow } from '../V4V5CyclesPayoutsPanel/V4V5ProjectA import { V4V5SendReservedTokensButton } from './V4V5SendReservedTokensButton' import { reservedTokensTooltip } from 'components/Project/ProjectTabs/TokensPanelTooltips' import { twMerge } from 'tailwind-merge' -import { useSuckers } from 'juice-sdk-react' +import { useSuckers } from '@bananapus/nana-sdk-react' import { useV4V5ReservedTokensSubPanel } from './hooks/useV4V5ReservedTokensSubPanel' export const V4V5ReservedTokensSubPanel = ({ diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5SendReservedTokensButton.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5SendReservedTokensButton.tsx index c71103d261..3ed2ea6801 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5SendReservedTokensButton.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5SendReservedTokensButton.tsx @@ -2,7 +2,7 @@ import { Button, Tooltip } from 'antd' import { useCallback, useState } from 'react' import { ArrowUpCircleIcon } from '@heroicons/react/24/outline' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { Trans } from '@lingui/macro' import V4V5DistributeReservedTokensModal from './V4V5DistributeReservedTokensModal' import { reloadWindow } from 'utils/windowUtils' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokenRedemptionCallout.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokenRedemptionCallout.tsx index 571d1f59c9..aaad137048 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokenRedemptionCallout.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokenRedemptionCallout.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from 'react' -import { useJBProjectId, useJBRulesetContext, useJBUpcomingRuleset } from 'juice-sdk-react' +import { useJBProjectId, useJBRulesetContext, useJBUpcomingRuleset } from '@bananapus/nana-sdk-react' import { InformationCircleIcon } from '@heroicons/react/24/outline' import { MAX_PAYOUT_LIMIT } from 'packages/v4v5/utils/math' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokensPanel.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokensPanel.tsx index 551e281e1b..9ad1f405bc 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokensPanel.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/V4V5TokensPanel.tsx @@ -1,11 +1,11 @@ import { Trans, t } from '@lingui/macro' import { Button, Tooltip } from 'antd' -import { JBChainId, JB_TOKEN_DECIMALS, formatUnits } from 'juice-sdk-core' +import { JBChainId, JB_TOKEN_DECIMALS, formatUnits } from '@bananapus/nana-sdk-core' import { useJBChainId, useJBContractContext, useSuckersUserTokenBalance, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { forwardRef, useMemo } from 'react' import { SettingOutlined } from '@ant-design/icons' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5BalanceMenuItemsUserFlags.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5BalanceMenuItemsUserFlags.ts index 9649078d53..23cbac0ea2 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5BalanceMenuItemsUserFlags.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5BalanceMenuItemsUserFlags.ts @@ -1,6 +1,6 @@ import { useWallet } from 'hooks/Wallet' -import { useJBContractContext, useJBRulesetMetadata, useNativeTokenSurplus } from 'juice-sdk-react' -import { jbTokensAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +import { useJBContractContext, useJBRulesetMetadata, useNativeTokenSurplus } from '@bananapus/nana-sdk-react' +import { jbTokensAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract, useChainId } from 'wagmi' import { useV4V5WalletHasPermission } from 'packages/v4v5/hooks/useV4V5WalletHasPermission' import { V4V5OperatorPermission } from 'packages/v4v5/models/v4Permissions' @@ -13,7 +13,7 @@ export const useV4V5BalanceMenuItemsUserFlags = () => { const { data: rulesetMetadata } = useJBRulesetMetadata() const chainId = useChainId() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const tokensAddress = jbContractAddress[versionString][JBCoreContracts.JBTokens][chainId as unknown as keyof typeof jbContractAddress[typeof versionString][JBCoreContracts.JBTokens]] const { projectId } = useJBContractContext() diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5ReservedTokensSubPanel.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5ReservedTokensSubPanel.tsx index 3219798373..cc78ff0b60 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5ReservedTokensSubPanel.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5ReservedTokensSubPanel.tsx @@ -7,11 +7,11 @@ import { jbControllerAbi, jbContractAddress, JBCoreContracts, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { useJBProjectId, useJBUpcomingRuleset, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { useReadContract } from 'wagmi' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' @@ -30,7 +30,7 @@ export const useV4V5ReservedTokensSubPanel = () => { const { selectedChainId, setSelectedChainId } = useReservedTokensSelectedChain() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { projectId } = useJBProjectId(selectedChainId) diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5TokensPanel.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5TokensPanel.tsx index 00a4de883d..1e851e505a 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5TokensPanel.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5TokensPanel.tsx @@ -1,8 +1,8 @@ -import { JBChainId, JBProjectToken } from 'juice-sdk-core' +import { JBChainId, JBProjectToken } from '@bananapus/nana-sdk-core' import { Tooltip } from 'antd' import { NETWORKS } from 'constants/networks' -import { useJBRulesetContext, useJBTokenContext } from 'juice-sdk-react' +import { useJBRulesetContext, useJBTokenContext } from '@bananapus/nana-sdk-react' import { ChainLogo } from 'packages/v4v5/components/ChainLogo' import { useV4V5UserTotalTokensBalance } from 'packages/v4v5/contexts/V4V5UserTotalTokensBalanceProvider' import { useProjectHasErc20Token } from 'packages/v4v5/hooks/useProjectHasErc20Token' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5YourBalanceMenuItems.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5YourBalanceMenuItems.tsx index 5216e4489d..30c30975a6 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5YourBalanceMenuItems.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5TokensPanel/hooks/useV4V5YourBalanceMenuItems.tsx @@ -2,8 +2,8 @@ import { PlusCircleIcon, ReceiptRefundIcon } from '@heroicons/react/24/outline' -import { useJBProjectId } from 'juice-sdk-react' -import { jbTokensAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +import { useJBProjectId } from '@bananapus/nana-sdk-react' +import { jbTokensAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import { ReactNode, useMemo, useState } from 'react' @@ -29,7 +29,7 @@ export const useV4V5YourBalanceMenuItems = () => { const { userAddress } = useWallet() const { version } = useV4V5Version() - const versionString = version.toString() as '4' | '5' + const versionString = version.toString() as '4' | '5' | '6' const { projectId, chainId } = useJBProjectId() diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/components/ProjectActivityList.tsx b/src/packages/v4v5/views/V4V5ProjectDashboard/components/ProjectActivityList.tsx index 37aa3e605e..6ca063f631 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/components/ProjectActivityList.tsx +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/components/ProjectActivityList.tsx @@ -9,7 +9,7 @@ import { } from 'packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5ActivityPanel/utils/transformEventsData' import React, { useState } from 'react' import { ActivityEvent } from 'packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5ActivityPanel/activityEventElems/ActivityElement' -import { useJBChainId, useJBContractContext } from 'juice-sdk-react' +import { useJBChainId, useJBContractContext } from '@bananapus/nana-sdk-react' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' const PAGE_SIZE = 20 diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5CurrentUpcomingSubPanel.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5CurrentUpcomingSubPanel.ts index 2cd002d5c3..22644fe2df 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5CurrentUpcomingSubPanel.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5CurrentUpcomingSubPanel.ts @@ -2,8 +2,8 @@ import { useJBProjectId, useJBRuleset, useJBContractContext, -} from 'juice-sdk-react' -import { jbRulesetsAbi, jbContractAddress, JBCoreContracts } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jbRulesetsAbi, jbContractAddress, JBCoreContracts } from '@bananapus/nana-sdk-core' import { useReadContract } from 'wagmi' import { V4ApprovalStatus } from 'models/approvalHooks' diff --git a/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5ProjectHeader.ts b/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5ProjectHeader.ts index c637e5784e..d1c77aef3a 100644 --- a/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5ProjectHeader.ts +++ b/src/packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5ProjectHeader.ts @@ -3,7 +3,7 @@ import { useJBChainId, useJBContractContext, useJBProjectMetadataContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { BigNumber } from '@ethersproject/bignumber' import { useProjectQuery, useSuckerGroupQuery } from 'generated/v4v5/graphql' @@ -13,7 +13,7 @@ import { getBendystrawClient } from 'lib/apollo/bendystrawClient' import { GnosisSafe } from 'models/safe' import useV4V5ProjectOwnerOf from 'packages/v4v5/hooks/useV4V5ProjectOwnerOf' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' -import { getJBContractAddress } from 'juice-sdk-core' +import { getJBContractAddress } from '@bananapus/nana-sdk-core' export interface ProjectHeaderData { title: string | undefined diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/ArchiveProjectSettingsPage.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ArchiveProjectSettingsPage.tsx index b7b280e267..4786a00ad7 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ArchiveProjectSettingsPage.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ArchiveProjectSettingsPage.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' import { Button, Statistic } from 'antd' import { Callout } from 'components/Callout/Callout' -import { RelayrPostBundleResponse, useJBProjectMetadataContext, useSuckers } from 'juice-sdk-react' +import { RelayrPostBundleResponse, useJBProjectMetadataContext, useSuckers } from '@bananapus/nana-sdk-react' import { uploadProjectMetadata } from 'lib/api/ipfs' import { useEditProjectDetailsTx } from 'packages/v4v5/hooks/useEditProjectDetailsTx' import { useOmnichainEditProjectDetailsTx } from 'packages/v4v5/hooks/useOmnichainEditProjectDetailsTx' @@ -10,7 +10,7 @@ import { emitErrorNotification, emitInfoNotification } from 'utils/notifications import { BigNumber } from '@ethersproject/bignumber' import ETHAmount from 'components/currency/ETHAmount' import TransactionModal from 'components/modals/TransactionModal' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ChainSelect } from 'packages/v4v5/components/ChainSelect' export function ArchiveProjectSettingsPage() { diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/CreateErc20TokenSettingsPage.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/CreateErc20TokenSettingsPage.tsx index c3e876b97b..f803dcecf0 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/CreateErc20TokenSettingsPage.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/CreateErc20TokenSettingsPage.tsx @@ -1,7 +1,7 @@ import { CheckCircleIcon } from '@heroicons/react/24/outline' import { Button, Form, Input, Modal } from 'antd' -import { JBChainId, createSalt, jbControllerAbi } from 'juice-sdk-core' -import { RelayrPostBundleResponse, useGetRelayrTxBundle, useJBChainId, useJBContractContext, useJBProjectId, useSendRelayrTx, useSuckers } from 'juice-sdk-react' +import { JBChainId, createSalt, jbControllerAbi } from '@bananapus/nana-sdk-core' +import { RelayrPostBundleResponse, useGetRelayrTxBundle, useJBChainId, useJBContractContext, useJBProjectId, useSendRelayrTx, useSuckers } from '@bananapus/nana-sdk-react' import { Trans, t } from '@lingui/macro' import { useRouter } from 'next/router' import { mainnet, sepolia } from 'viem/chains' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/DetailsSection/CycleDeadlineDropdown.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/DetailsSection/CycleDeadlineDropdown.tsx index c311409798..443c435078 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/DetailsSection/CycleDeadlineDropdown.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/DetailsSection/CycleDeadlineDropdown.tsx @@ -5,7 +5,7 @@ import { useJBChainId, useJBContractContext, useJBRuleset, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { BallotStrategy } from 'models/ballot' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { getAvailableApprovalStrategies } from 'packages/v4v5/utils/approvalHooks' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCycleFormFields.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCycleFormFields.ts index a5e2eb4bcc..bfa6b61ce7 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCycleFormFields.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCycleFormFields.ts @@ -1,6 +1,6 @@ import { DurationOption } from 'components/inputs/DurationInput' import { CurrencyName } from 'constants/currency' -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' type DetailsSectionFields = { duration: number diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCyclePage.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCyclePage.tsx index 04f8e643dd..54ac440099 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCyclePage.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/EditCyclePage.tsx @@ -14,7 +14,7 @@ import { Trans } from '@lingui/macro' import { helpPagePath } from 'utils/helpPagePath' import { settingsPagePath } from 'packages/v4v5/utils/routes' import { useEditCycleFormContext } from './EditCycleFormContext' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { useRouter } from 'next/router' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/PayoutsSection.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/PayoutsSection.tsx index b1b398bcf1..c9d9df98a7 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/PayoutsSection.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/PayoutsSection.tsx @@ -1,4 +1,4 @@ -import { JBSplit, MAX_PAYOUT_LIMIT } from 'juice-sdk-core' +import { JBSplit, MAX_PAYOUT_LIMIT } from '@bananapus/nana-sdk-core' import { Trans } from '@lingui/macro' import { Form } from 'antd' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedJBProjectBeneficiary.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedJBProjectBeneficiary.tsx index 76e61b457b..1f6319dd23 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedJBProjectBeneficiary.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedJBProjectBeneficiary.tsx @@ -1,6 +1,6 @@ import { DiffedItem } from 'components/DiffedItem' import EthereumAddress from 'components/EthereumAddress' -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' import { JuiceboxProjectBeneficiary } from 'packages/v4v5/components/SplitList/SplitItem/JuiceboxProjectBeneficiary' export function DiffedJBProjectBeneficiary({ diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedSplitValue.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedSplitValue.tsx index dd8937a6b5..69df0eb808 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedSplitValue.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitFields/DiffedSplitValue.tsx @@ -1,5 +1,5 @@ import { DiffedItem } from 'components/DiffedItem' -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' import { SplitProps } from 'packages/v4v5/components/SplitList/SplitItem' import { SplitAmountValue } from 'packages/v4v5/components/SplitList/SplitItem/SplitAmountValue' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitList.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitList.tsx index 277fb882dd..ba1ad77d18 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitList.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/DiffedSplits/DiffedSplitList.tsx @@ -1,7 +1,7 @@ import { processUniqueSplits, v4GetProjectOwnerRemainderSplit } from 'packages/v4v5/utils/v4Splits' import { DiffedSplitItem } from './DiffedSplitItem' -import { JBSplit as Split } from 'juice-sdk-core' +import { JBSplit as Split } from '@bananapus/nana-sdk-core' import { SplitProps } from 'packages/v4v5/components/SplitList/SplitItem' import round from 'lodash/round' import { useMemo } from 'react' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/FormattedRulesetValues/DetailsSection/PayoutLimitValue.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/FormattedRulesetValues/DetailsSection/PayoutLimitValue.tsx index 173270da6e..7f00926ad1 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/FormattedRulesetValues/DetailsSection/PayoutLimitValue.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/FormattedRulesetValues/DetailsSection/PayoutLimitValue.tsx @@ -1,7 +1,7 @@ import { Trans } from '@lingui/macro' import TooltipIcon from 'components/TooltipIcon' import { CurrencyName } from 'constants/currency' -import { NativeTokenValue } from 'juice-sdk-react' +import { NativeTokenValue } from '@bananapus/nana-sdk-react' import { isInfinitePayoutLimit } from 'packages/v4v5/utils/fundingCycle' export function PayoutLimitValue({ diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/ReviewConfirmModal.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/ReviewConfirmModal.tsx index b76885cb23..6bf1a7b692 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/ReviewConfirmModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/ReviewConfirmModal.tsx @@ -1,6 +1,6 @@ import { Trans, t } from '@lingui/macro' -import { JBChainId, NATIVE_TOKEN } from 'juice-sdk-core' -import { useJBChainId, useJBContractContext, useJBProjectId, useJBRuleset, useSuckers } from 'juice-sdk-react' +import { JBChainId, NATIVE_TOKEN } from '@bananapus/nana-sdk-core' +import { useJBChainId, useJBContractContext, useJBProjectId, useJBRuleset, useSuckers } from '@bananapus/nana-sdk-react' import { EditCycleTxArgs, transformEditCycleFormFieldsToTxArgs } from 'packages/v4v5/utils/editRuleset' import { useEffect, useState, useContext } from 'react' @@ -13,7 +13,7 @@ import { JuiceTextArea } from 'components/inputs/JuiceTextArea' import TransactionModal from 'components/modals/TransactionModal' import { useGnosisSafe } from 'hooks/safe/useGnosisSafe' import { useWallet } from 'hooks/Wallet' -import type { RelayrPostBundleResponse } from 'juice-sdk-react' +import type { RelayrPostBundleResponse } from '@bananapus/nana-sdk-react' import moment from 'moment' import { ChainSelect } from 'packages/v4v5/components/ChainSelect' import { CreateCollapse } from 'packages/v4v5/components/Create/components/CreateCollapse/CreateCollapse' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useDetailsSectionValues.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useDetailsSectionValues.ts index 07c52337e6..af25e954c0 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useDetailsSectionValues.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useDetailsSectionValues.ts @@ -1,6 +1,6 @@ import { getApprovalStrategyByAddress } from 'packages/v4v5/utils/approvalHooks' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' -import { useJBChainId } from 'juice-sdk-react' +import { useJBChainId } from '@bananapus/nana-sdk-react' import { otherUnitToSeconds } from 'utils/format/formatTime' import { useEditCycleFormContext } from '../../EditCycleFormContext' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/usePayoutsSectionValues.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/usePayoutsSectionValues.ts index 57d85772cf..5ef0618a89 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/usePayoutsSectionValues.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/usePayoutsSectionValues.ts @@ -1,5 +1,5 @@ import { CurrencyName } from 'constants/currency' -import { JBSplit } from 'juice-sdk-core' +import { JBSplit } from '@bananapus/nana-sdk-core' import { distributionLimitsEqual } from 'packages/v4v5/utils/distributions' import { isInfinitePayoutLimit } from 'packages/v4v5/utils/fundingCycle' import { MAX_PAYOUT_LIMIT } from 'packages/v4v5/utils/math' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useTokensSectionValues.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useTokensSectionValues.ts index 0265bf78cc..c6d979d828 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useTokensSectionValues.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/ReviewConfirmModal/hooks/useTokensSectionValues.ts @@ -2,7 +2,7 @@ import { useJBProjectId, useJBRuleset, useJBTokenContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { EditCycleFormFields } from '../../EditCycleFormFields' import round from 'lodash/round' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TokensSection/ReservedTokensField.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TokensSection/ReservedTokensField.tsx index c3491aa5a4..04ec8f9088 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TokensSection/ReservedTokensField.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TokensSection/ReservedTokensField.tsx @@ -1,4 +1,4 @@ -import { JBSplit, SPLITS_TOTAL_PERCENT } from 'juice-sdk-core' +import { JBSplit, SPLITS_TOTAL_PERCENT } from '@bananapus/nana-sdk-core' import { Trans } from '@lingui/macro' import { useWatch } from 'antd/lib/form/Form' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx index fdc6735137..8406c30b7f 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx @@ -1,6 +1,6 @@ import { Button, Modal } from 'antd' -import { useJBChainId, useJBProjectId } from 'juice-sdk-react' -import { settingsPagePath, v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { useJBChainId, useJBProjectId } from '@bananapus/nana-sdk-react' +import { settingsPagePath, v4v5ProjectRoute } from 'packages/v4v5/utils/routes' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' import { CheckCircleIcon } from '@heroicons/react/24/outline' @@ -47,10 +47,11 @@ export function TransactionSuccessModal({ Back to settings - + diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useEditCycleFormHasError.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useEditCycleFormHasError.tsx index 3ce1240375..28d1791e63 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useEditCycleFormHasError.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useEditCycleFormHasError.tsx @@ -1,6 +1,6 @@ import { Trans } from '@lingui/macro' import { useWatch } from 'antd/lib/form/Form' -import { SPLITS_TOTAL_PERCENT } from 'juice-sdk-core' +import { SPLITS_TOTAL_PERCENT } from '@bananapus/nana-sdk-core' import { totalSplitsPercent } from 'packages/v4v5/utils/v4Splits' import { useEditCycleFormContext } from '../EditCycleFormContext' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useLoadEditCycleData.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useLoadEditCycleData.tsx index 556679fb5b..36fa9b4871 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useLoadEditCycleData.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useLoadEditCycleData.tsx @@ -1,4 +1,4 @@ -import { useJBChainId, useJBProjectId, useJBRuleset, useJBUpcomingRuleset } from 'juice-sdk-react' +import { useJBChainId, useJBProjectId, useJBRuleset, useJBUpcomingRuleset } from '@bananapus/nana-sdk-react' import { useEffect, useMemo, useState } from 'react' import { deriveDurationOption, @@ -7,7 +7,7 @@ import { } from 'utils/format/formatTime' import { Form } from 'antd' -import { Ether } from 'juice-sdk-core' +import { Ether } from '@bananapus/nana-sdk-core' import { usePayoutLimit } from 'packages/v4v5/hooks/usePayoutLimit' import { useV4V5CurrentPayoutSplits } from 'packages/v4v5/hooks/useV4V5CurrentPayoutSplits' import { useV4V5ReservedSplits } from 'packages/v4v5/hooks/useV4V5ReservedSplits' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useOmnichainEditCycle.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useOmnichainEditCycle.ts index 833ffedea0..9ff3624930 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useOmnichainEditCycle.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/hooks/useOmnichainEditCycle.ts @@ -1,5 +1,5 @@ -import { JBChainId, jbContractAddress, JBOmnichainDeployerContracts, JBCoreContracts, jbOmnichainDeployer4_1Abi } from 'juice-sdk-core' -import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBContractContext, useSendRelayrTx } from 'juice-sdk-react' +import { JBChainId, jbContractAddress, JBOmnichainDeployerContracts, JBCoreContracts, jbOmnichainDeployerAbi, jbOmnichainDeployer4_1Abi, jbOmnichainDeployerV5Abi } from '@bananapus/nana-sdk-core' +import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBContractContext, useSendRelayrTx } from '@bananapus/nana-sdk-react' import { useWallet } from 'hooks/Wallet' import { EditCycleTxArgs } from 'packages/v4v5/utils/editRuleset' @@ -30,32 +30,51 @@ export function useOmnichainEditCycle() { chainIds.map(async chainId => { const baseArgs = editData[chainId] if (!baseArgs) throw new Error(`No edit data for chain ${chainId}`) - const args = [...baseArgs, projectControllerAddress] as const - // V5 projects use V5's omnichain deployer, V4 projects use V4's deployers let to: `0x${string}` - if (version === 5) { - // V5 only has JBOmnichainDeployer - to = jbContractAddress['5']['JBOmnichainDeployer'][chainId] as `0x${string}` + let encoded: `0x${string}` + let gas: bigint + + if (version === 6) { + // V6's omnichain deployer dropped the trailing controller arg from queueRulesetsOf + to = jbContractAddress['6'][JBOmnichainDeployerContracts.JBOmnichainDeployer][chainId] as `0x${string}` + gas = await estimateContractGasWithFallback({ + chainId, + contractAddress: to, + abi: jbOmnichainDeployerAbi, + functionName: 'queueRulesetsOf', + args: baseArgs, + userAddress, + fallbackGas: OMNICHAIN_GAS_FALLBACKS.QUEUE_RULESETS, + }) + encoded = encodeFunctionData({ abi: jbOmnichainDeployerAbi, functionName: 'queueRulesetsOf', args: baseArgs }) } else { - // V4 has two deployers: use 4_1 for controller 4.1, regular for older controllers - to = jbContractAddress['4'][JBOmnichainDeployerContracts.JBOmnichainDeployer4_1][chainId] as `0x${string}` - if (projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController][chainId]) { - to = jbContractAddress['4'][JBOmnichainDeployerContracts.JBOmnichainDeployer][chainId] as `0x${string}` - } - } + // V4/V5 deployers take a trailing controller arg + const args = [...baseArgs, projectControllerAddress] as const - const gas = await estimateContractGasWithFallback({ - chainId, - contractAddress: to, - abi: jbOmnichainDeployer4_1Abi, - functionName: 'queueRulesetsOf', - args, - userAddress, - fallbackGas: OMNICHAIN_GAS_FALLBACKS.QUEUE_RULESETS, - }) + if (version === 5) { + // V5 only has JBOmnichainDeployer + to = jbContractAddress['5'][JBOmnichainDeployerContracts.JBOmnichainDeployer][chainId] as `0x${string}` + } else { + // V4 has two deployers: use 4_1 for controller 4.1, regular for older controllers + to = jbContractAddress['4'][JBOmnichainDeployerContracts.JBOmnichainDeployer4_1][chainId] as `0x${string}` + if (projectControllerAddress === jbContractAddress['4'][JBCoreContracts.JBController][chainId]) { + to = jbContractAddress['4'][JBOmnichainDeployerContracts.JBOmnichainDeployer][chainId] as `0x${string}` + } + } - const encoded = encodeFunctionData({ abi: jbOmnichainDeployer4_1Abi, functionName: 'queueRulesetsOf', args }) + const abi = version === 5 ? jbOmnichainDeployerV5Abi : jbOmnichainDeployer4_1Abi + gas = await estimateContractGasWithFallback({ + chainId, + contractAddress: to, + abi, + functionName: 'queueRulesetsOf', + args, + userAddress, + fallbackGas: OMNICHAIN_GAS_FALLBACKS.QUEUE_RULESETS, + }) + encoded = encodeFunctionData({ abi, functionName: 'queueRulesetsOf', args }) + } return { data: { from: userAddress, to, value: 0n, gas, data: encoded }, diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/EditNftsPage.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/EditNftsPage.tsx index 6149e11856..d4c0090524 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/EditNftsPage.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/EditNftsPage.tsx @@ -1,5 +1,5 @@ import { ProjectMetadataContext } from 'contexts/ProjectMetadataContext' -import { useJBRulesetContext } from 'juice-sdk-react' +import { useJBRulesetContext } from '@bananapus/nana-sdk-react' import { useNftDeployerCanReconfigure } from 'packages/v2v3/hooks/JB721Delegate/contractReader/useNftDeployerCanReconfigure' import { useHasNftRewards } from 'packages/v4v5/hooks/useHasNftRewards' import useV4V5ProjectOwnerOf from 'packages/v4v5/hooks/useV4V5ProjectOwnerOf' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/EditNftsSection.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/EditNftsSection.tsx index aaad0d60a3..a4553fa005 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/EditNftsSection.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/EditNftsSection.tsx @@ -9,9 +9,9 @@ import { RewardsList } from 'components/NftRewards/RewardsList/RewardsList' import ETHAmount from 'components/currency/ETHAmount' import TransactionModal from 'components/modals/TransactionModal' import { useGnosisSafe } from 'hooks/safe/useGnosisSafe' -import { JBChainId } from 'juice-sdk-core' -import type { RelayrPostBundleResponse } from 'juice-sdk-react' -import { useJBChainId, useSuckers } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-core' +import type { RelayrPostBundleResponse } from '@bananapus/nana-sdk-react' +import { useJBChainId, useSuckers } from '@bananapus/nana-sdk-react' import { ChainSelect } from 'packages/v4v5/components/ChainSelect' import { useHasNftRewards } from 'packages/v4v5/hooks/useHasNftRewards' import useV4V5ProjectOwnerOf from 'packages/v4v5/hooks/useV4V5ProjectOwnerOf' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/components/QueueSafeEditNftsTxsModal.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/components/QueueSafeEditNftsTxsModal.tsx index 05569aa7b7..90afff03ea 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/components/QueueSafeEditNftsTxsModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/UpdateNftsPage/components/QueueSafeEditNftsTxsModal.tsx @@ -1,7 +1,7 @@ import { SafeProposeTransactionResponse, useProposeSafeTransaction } from 'packages/v4v5/hooks/useProposeSafeTransaction' import { Trans } from '@lingui/macro' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { NftRewardTier } from 'models/nftRewards' import QueueSafeTxsModal from 'packages/v4v5/components/QueueSafeTxsModal' import { usePopulateNftUpdateTx } from 'packages/v4v5/hooks/usePopulateNftUpdateTx' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useOmnichainUpdateCurrentCollection.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useOmnichainUpdateCurrentCollection.ts index 053dcc5182..4403e1f4c3 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useOmnichainUpdateCurrentCollection.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useOmnichainUpdateCurrentCollection.ts @@ -1,10 +1,10 @@ import { Address, encodeFunctionData } from 'viem' -import { JBChainId, createSalt, jb721TiersHookAbi } from 'juice-sdk-core' +import { JBChainId, createSalt, jb721TiersHookAbi, jb721TiersHookV5Abi } from '@bananapus/nana-sdk-core' import { JB_721_TIER_PARAMS_V4, NftRewardTier } from 'models/nftRewards' import { buildJB721TierParams, pinNftRewards } from 'utils/nftRewards' -import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBRulesetContext, useSendRelayrTx } from 'juice-sdk-react' +import { useGetRelayrTxBundle, useGetRelayrTxQuote, useJBRulesetContext, useSendRelayrTx } from '@bananapus/nana-sdk-react' -import { JB721DelegateVersion } from 'models/JB721Delegate' +import { JB721DelegateVersion, jb721TierConfigToV6 } from 'models/JB721Delegate' import { useWallet } from 'hooks/Wallet' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' @@ -39,19 +39,37 @@ export function useOmnichainUpdateCurrentCollection() { const tierParams = buildJB721TierParams({ cids: tierCids, rewardTiers: newTiers, - version: version === 5 ? JB721DelegateVersion.JB721DELEGATE_V5 : JB721DelegateVersion.JB721DELEGATE_V4, + version: + version === 6 + ? JB721DelegateVersion.JB721DELEGATE_V6 + : version === 5 + ? JB721DelegateVersion.JB721DELEGATE_V5 + : JB721DelegateVersion.JB721DELEGATE_V4, }) // Common salt const salt = createSalt() + const tierIdsToRemove = editedRewardTierIds.map(i => BigInt(i)) + const txs = chainIds.map(chainId => { - // Use the correct abi and function name - const encoded = encodeFunctionData({ - abi: jb721TiersHookAbi, - functionName: 'adjustTiers', - args: [tierParams as JB_721_TIER_PARAMS_V4[], editedRewardTierIds.map(i => BigInt(i))] - }) + // The v6 hook's adjustTiers takes a different tier config shape + // (nested flags tuple + splitPercent/splits) than v4/v5. + const encoded = + version === 6 + ? encodeFunctionData({ + abi: jb721TiersHookAbi, + functionName: 'adjustTiers', + args: [ + (tierParams as JB_721_TIER_PARAMS_V4[]).map(jb721TierConfigToV6), + tierIdsToRemove, + ], + }) + : encodeFunctionData({ + abi: jb721TiersHookV5Abi, + functionName: 'adjustTiers', + args: [tierParams as JB_721_TIER_PARAMS_V4[], tierIdsToRemove], + }) // Use the NFT hook address from the ruleset context // Note: This assumes the same hook address is used across all chains diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useUpdateCurrentCollection.ts b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useUpdateCurrentCollection.ts index c9706eaeb3..e8206d3aa9 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useUpdateCurrentCollection.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditNftsPage/hooks/useUpdateCurrentCollection.ts @@ -1,8 +1,8 @@ import { useJBChainId, useJBRulesetContext, -} from 'juice-sdk-react' -import { jb721TiersHookAbi } from 'juice-sdk-core' +} from '@bananapus/nana-sdk-react' +import { jb721TiersHookAbi, jb721TiersHookV5Abi } from '@bananapus/nana-sdk-core' import { useWriteContract } from 'wagmi' import { JB_721_TIER_PARAMS_V4, NftRewardTier } from 'models/nftRewards' import { useCallback, useContext, useState } from 'react' @@ -12,7 +12,7 @@ import { t } from '@lingui/macro' import { waitForTransactionReceipt } from '@wagmi/core' import { NEW_NFT_ID_LOWER_LIMIT } from 'components/NftRewards/RewardsList/AddEditRewardModal' import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' -import { JB721DelegateVersion } from 'models/JB721Delegate' +import { JB721DelegateVersion, jb721TierConfigToV6 } from 'models/JB721Delegate' import { wagmiConfig } from 'contexts/Para/Providers' import { emitErrorNotification } from 'utils/notifications' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' @@ -55,7 +55,12 @@ export function useUpdateCurrentCollection({ const tiersToAdd = buildJB721TierParams({ cids: rewardTiersCIDs, rewardTiers: newRewardTiers, - version: version === 5 ? JB721DelegateVersion.JB721DELEGATE_V5 : JB721DelegateVersion.JB721DELEGATE_V4, + version: + version === 6 + ? JB721DelegateVersion.JB721DELEGATE_V6 + : version === 5 + ? JB721DelegateVersion.JB721DELEGATE_V5 + : JB721DelegateVersion.JB721DELEGATE_V4, }) as JB_721_TIER_PARAMS_V4[] if (!newRewardTiers) { @@ -65,13 +70,26 @@ export function useUpdateCurrentCollection({ return } try { - const hash = await writeAdjustTiers({ - abi: jb721TiersHookAbi, - functionName: 'adjustTiers', - chainId, - args: [tiersToAdd, editedRewardTierIds.map(id => BigInt(id))], - address: rulesetMetadata.dataHook, - }) + const tierIdsToRemove = editedRewardTierIds.map(id => BigInt(id)) + + // The v6 hook's adjustTiers takes a different tier config shape + // (nested flags tuple + splitPercent/splits) than v4/v5. + const hash = + version === 6 + ? await writeAdjustTiers({ + abi: jb721TiersHookAbi, + functionName: 'adjustTiers', + chainId, + args: [tiersToAdd.map(jb721TierConfigToV6), tierIdsToRemove], + address: rulesetMetadata.dataHook, + }) + : await writeAdjustTiers({ + abi: jb721TiersHookV5Abi, + functionName: 'adjustTiers', + chainId, + args: [tiersToAdd, tierIdsToRemove], + address: rulesetMetadata.dataHook, + }) addTransaction?.('Update NFT rewards', { hash, chainId }) await waitForTransactionReceipt(wagmiConfig, { diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/ProjectDetailsSettingsPage.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/ProjectDetailsSettingsPage.tsx index 9d21fd85f4..0e56f9d85d 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/ProjectDetailsSettingsPage.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/ProjectDetailsSettingsPage.tsx @@ -1,5 +1,5 @@ import { ProjectDetailsForm, ProjectDetailsFormFields } from 'components/Project/ProjectSettings/ProjectDetailsForm' -import { RelayrPostBundleResponse, useJBChainId, useJBProjectMetadataContext, useSuckers } from 'juice-sdk-react' +import { RelayrPostBundleResponse, useJBChainId, useJBProjectMetadataContext, useSuckers } from '@bananapus/nana-sdk-react' import { useCallback, useEffect, useState } from 'react' import { BigNumber } from '@ethersproject/bignumber' @@ -10,7 +10,7 @@ import ETHAmount from 'components/currency/ETHAmount' import TransactionModal from 'components/modals/TransactionModal' import { PROJECT_PAY_CHARACTER_LIMIT } from 'constants/numbers' import { useGnosisSafe } from 'hooks/safe/useGnosisSafe' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { uploadProjectMetadata } from 'lib/api/ipfs' import { ChainSelect } from 'packages/v4v5/components/ChainSelect' import { useEditProjectDetailsTx } from 'packages/v4v5/hooks/useEditProjectDetailsTx' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/components/QueueSafeProjectDetailsTxsModal.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/components/QueueSafeProjectDetailsTxsModal.tsx index ee6507aa1f..47ca1b82a3 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/components/QueueSafeProjectDetailsTxsModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectDetailsSettingsPage/components/QueueSafeProjectDetailsTxsModal.tsx @@ -1,7 +1,7 @@ import { Trans, t } from '@lingui/macro' import { FormInstance, useWatch } from 'antd/lib/form/Form' -import { JBChainId, JBProjectMetadata, jbControllerAbi } from 'juice-sdk-core' -import { useJBContractContext, useSuckers } from 'juice-sdk-react' +import { JBChainId, JBProjectMetadata, jbControllerAbi } from '@bananapus/nana-sdk-core' +import { useJBContractContext, useSuckers } from '@bananapus/nana-sdk-react' import { SafeProposeTransactionResponse, useProposeSafeTransaction } from 'packages/v4v5/hooks/useProposeSafeTransaction' import { ProjectDetailsFormFields } from 'components/Project/ProjectSettings/ProjectDetailsForm' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsContent.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsContent.tsx index daec5c288a..954cfe27bd 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsContent.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsContent.tsx @@ -3,7 +3,7 @@ import { Button, Layout } from 'antd' import { ChevronRightIcon } from '@heroicons/react/20/solid' import { ArrowLeftIcon } from '@heroicons/react/24/outline' -import { useJBRulesetContext } from 'juice-sdk-react' +import { useJBRulesetContext } from '@bananapus/nana-sdk-react' import Link from 'next/link' import { useMemo } from 'react' import { twJoin } from 'tailwind-merge' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsDashboard.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsDashboard.tsx index 57367f78b6..5701075210 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsDashboard.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsDashboard.tsx @@ -3,7 +3,7 @@ import { useJBChainId, useJBContractContext, useJBProjectMetadataContext, -} from 'juice-sdk-react' +} from '@bananapus/nana-sdk-react' import { Trans } from '@lingui/macro' import { Button } from 'antd' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx index cc4adfbc36..91f6744278 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx @@ -1,10 +1,10 @@ import { Cog6ToothIcon, XMarkIcon } from '@heroicons/react/24/solid' -import { useJBChainId, useJBContractContext } from 'juice-sdk-react' +import { useJBChainId, useJBContractContext } from '@bananapus/nana-sdk-react' import { Trans } from '@lingui/macro' -import { JB_CHAINS } from 'juice-sdk-core' +import { JB_CHAINS } from '@bananapus/nana-sdk-core' import Link from 'next/link' -import { v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +import { v4v5ProjectRoute } from 'packages/v4v5/utils/routes' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' export const ProjectSettingsLayout: React.FC = ({ @@ -28,10 +28,11 @@ export const ProjectSettingsLayout: React.FC = ({ {chainId ? ( diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/components/QueueSafeDeployErc20TxsModal.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/components/QueueSafeDeployErc20TxsModal.tsx index 4c5f469766..b636058a3c 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/components/QueueSafeDeployErc20TxsModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/components/QueueSafeDeployErc20TxsModal.tsx @@ -1,7 +1,7 @@ import { Trans, t } from '@lingui/macro' import { FormInstance } from 'antd' -import { JBChainId, createSalt, jbControllerAbi } from 'juice-sdk-core' -import { useJBContractContext, useSuckers } from 'juice-sdk-react' +import { JBChainId, createSalt, jbControllerAbi } from '@bananapus/nana-sdk-core' +import { useJBContractContext, useSuckers } from '@bananapus/nana-sdk-react' import { SafeProposeTransactionResponse, useProposeSafeTransaction } from 'packages/v4v5/hooks/useProposeSafeTransaction' import { IssueErc20TokenTxArgs } from 'components/buttons/IssueErc20TokenButton' diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/hooks/useSettingsPagePath.ts b/src/packages/v4v5/views/V4V5ProjectSettings/hooks/useSettingsPagePath.ts index 5e13b575a1..b7a47d136e 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/hooks/useSettingsPagePath.ts +++ b/src/packages/v4v5/views/V4V5ProjectSettings/hooks/useSettingsPagePath.ts @@ -1,4 +1,4 @@ -import { useJBChainId, useJBContractContext } from 'juice-sdk-react' +import { useJBChainId, useJBContractContext } from '@bananapus/nana-sdk-react' import { SettingsPageKey } from '../ProjectSettingsDashboard' import { settingsPagePath } from 'packages/v4v5/utils/routes' diff --git a/src/pages/api/juicebox/v4/project/[projectId]/sucker-pairs.ts b/src/pages/api/juicebox/v4/project/[projectId]/sucker-pairs.ts index 3c6026b353..012c68f243 100644 --- a/src/pages/api/juicebox/v4/project/[projectId]/sucker-pairs.ts +++ b/src/pages/api/juicebox/v4/project/[projectId]/sucker-pairs.ts @@ -1,5 +1,5 @@ -import { resolveSuckers } from 'juice-sdk-core' -import { JBChainId } from 'juice-sdk-react' +import { JBVersion, resolveSuckers } from '@bananapus/nana-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-react' import { enableCors } from 'lib/api/nextjs' import { getLogger } from 'lib/logger' import { NextApiRequest, NextApiResponse } from 'next' @@ -26,11 +26,18 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => { .status(400) .json({ error: 'projectId and chainId is required' }) } + + // Defaults to 4 for backwards compatibility with older clients. + const version = req.query.version ? Number(req.query.version as string) : 4 + if (version !== 4 && version !== 5 && version !== 6) { + return res.status(400).json({ error: 'version must be 4, 5 or 6' }) + } + const suckers = await resolveSuckers({ config: wagmiConfig, chainId, projectId: BigInt(projectId as string), - version: 4, + version: version as JBVersion, }) // cache for 1 week diff --git a/src/pages/api/juicebox/v4/terminal/[terminalAddress]/jb-terminal-store.ts b/src/pages/api/juicebox/v4/terminal/[terminalAddress]/jb-terminal-store.ts index ad2db68b81..2bf956604a 100644 --- a/src/pages/api/juicebox/v4/terminal/[terminalAddress]/jb-terminal-store.ts +++ b/src/pages/api/juicebox/v4/terminal/[terminalAddress]/jb-terminal-store.ts @@ -1,6 +1,6 @@ -import { jbMultiTerminalAbi } from 'juice-sdk-core' +import { jbMultiTerminalAbi } from '@bananapus/nana-sdk-core' import { readContract } from 'wagmi/actions' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { enableCors } from 'lib/api/nextjs' import { getLogger } from 'lib/logger' import { NextApiRequest, NextApiResponse } from 'next' diff --git a/src/pages/api/projects/index.ts b/src/pages/api/projects/index.ts index 31066e8239..ee0c4eff51 100644 --- a/src/pages/api/projects/index.ts +++ b/src/pages/api/projects/index.ts @@ -1,4 +1,4 @@ -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { enableCors } from 'lib/api/nextjs' import { queryDBProjectsAggregates } from 'lib/api/supabase/projects' import { DBProjectQueryOpts } from 'models/dbProject' diff --git a/src/pages/api/projects/trending.ts b/src/pages/api/projects/trending.ts index 430e1e9842..ad72d39156 100644 --- a/src/pages/api/projects/trending.ts +++ b/src/pages/api/projects/trending.ts @@ -6,7 +6,7 @@ import { TrendingProjectsDocument, TrendingProjectsQuery, } from 'generated/graphql' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { sudoPublicDbClient } from 'lib/api/supabase/clients' import { serverClient } from 'lib/apollo/serverClient' import { DBProjectsAggregateRow } from 'models/dbProject' diff --git a/src/pages/create/index.tsx b/src/pages/create/index.tsx index ad30eff294..66b609a38c 100644 --- a/src/pages/create/index.tsx +++ b/src/pages/create/index.tsx @@ -28,8 +28,8 @@ const V4V5VersionProvider = dynamic( ) export default function CreatePage() { - const contentByVersion = featureFlagEnabled(FEATURE_FLAGS.V4) ? ( - + const contentByVersion = featureFlagEnabled(FEATURE_FLAGS.V6) ? ( + ) : ( diff --git a/src/pages/v4/[jbUrn]/index.tsx b/src/pages/v4/[jbUrn]/index.tsx index 1581782f71..ea581682ec 100644 --- a/src/pages/v4/[jbUrn]/index.tsx +++ b/src/pages/v4/[jbUrn]/index.tsx @@ -1,7 +1,7 @@ import { FEATURE_FLAGS } from 'constants/featureFlags' import { PV_V4 } from 'constants/pv' import { SiteBaseUrl } from 'constants/url' -import { jbUrn, toJbUrn } from 'juice-sdk-core' +import { jbUrn, toJbUrn } from '@bananapus/nana-sdk-core' import { loadCatalog } from 'locales/utils' import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from 'next' import dynamic from 'next/dynamic' diff --git a/src/pages/v4/[jbUrn]/settings/[settingsPage].tsx b/src/pages/v4/[jbUrn]/settings/[settingsPage].tsx index 609321b134..75d9ea85cd 100644 --- a/src/pages/v4/[jbUrn]/settings/[settingsPage].tsx +++ b/src/pages/v4/[jbUrn]/settings/[settingsPage].tsx @@ -1,4 +1,4 @@ -import { jbUrn } from 'juice-sdk-core' +import { jbUrn } from '@bananapus/nana-sdk-core' import { useRouter } from 'next/router' import { V4V5SettingsProvider } from 'packages/v4v5/contexts/V4V5SettingsProvider' import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/pages/v4/[jbUrn]/settings/index.tsx b/src/pages/v4/[jbUrn]/settings/index.tsx index 82d8713f67..432898454b 100644 --- a/src/pages/v4/[jbUrn]/settings/index.tsx +++ b/src/pages/v4/[jbUrn]/settings/index.tsx @@ -1,4 +1,4 @@ -import { jbUrn } from 'juice-sdk-core' +import { jbUrn } from '@bananapus/nana-sdk-core' import { useRouter } from 'next/router' import { V4V5SettingsProvider } from 'packages/v4v5/contexts/V4V5SettingsProvider' import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/pages/v5/[jbUrn]/index.tsx b/src/pages/v5/[jbUrn]/index.tsx index b5f3ea52d8..273d7b7bf3 100644 --- a/src/pages/v5/[jbUrn]/index.tsx +++ b/src/pages/v5/[jbUrn]/index.tsx @@ -1,7 +1,7 @@ import { FEATURE_FLAGS } from 'constants/featureFlags' import { PV_V5 } from 'constants/pv' import { SiteBaseUrl } from 'constants/url' -import { jbUrn, toJbUrn } from 'juice-sdk-core' +import { jbUrn, toJbUrn } from '@bananapus/nana-sdk-core' import { loadCatalog } from 'locales/utils' import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from 'next' import dynamic from 'next/dynamic' diff --git a/src/pages/v5/[jbUrn]/settings/[settingsPage].tsx b/src/pages/v5/[jbUrn]/settings/[settingsPage].tsx index fb7fdeb190..b8337db129 100644 --- a/src/pages/v5/[jbUrn]/settings/[settingsPage].tsx +++ b/src/pages/v5/[jbUrn]/settings/[settingsPage].tsx @@ -1,4 +1,4 @@ -import { jbUrn } from 'juice-sdk-core' +import { jbUrn } from '@bananapus/nana-sdk-core' import { useRouter } from 'next/router' import { V4V5SettingsProvider } from 'packages/v4v5/contexts/V4V5SettingsProvider' import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/pages/v5/[jbUrn]/settings/index.tsx b/src/pages/v5/[jbUrn]/settings/index.tsx index f7ba99a45a..74a491d12a 100644 --- a/src/pages/v5/[jbUrn]/settings/index.tsx +++ b/src/pages/v5/[jbUrn]/settings/index.tsx @@ -1,4 +1,4 @@ -import { jbUrn } from 'juice-sdk-core' +import { jbUrn } from '@bananapus/nana-sdk-core' import { useRouter } from 'next/router' import { V4V5SettingsProvider } from 'packages/v4v5/contexts/V4V5SettingsProvider' import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' diff --git a/src/pages/v6/[jbUrn]/index.tsx b/src/pages/v6/[jbUrn]/index.tsx new file mode 100644 index 0000000000..b873472947 --- /dev/null +++ b/src/pages/v6/[jbUrn]/index.tsx @@ -0,0 +1,138 @@ +import { FEATURE_FLAGS } from 'constants/featureFlags' +import { PV_V6 } from 'constants/pv' +import { SiteBaseUrl } from 'constants/url' +import { jbUrn, toJbUrn } from '@bananapus/nana-sdk-core' +import { loadCatalog } from 'locales/utils' +import { GetStaticPaths, GetStaticProps, InferGetStaticPropsType } from 'next' +import dynamic from 'next/dynamic' +import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' +import React, { PropsWithChildren } from 'react' +import { featureFlagEnabled } from 'utils/featureFlags' +import { cidFromUrl, ipfsPublicGatewayUrl } from 'utils/ipfs' +import { + getProjectStaticProps, + ProjectPageProps, +} from 'utils/server/pages/props' +import { stripHtmlTags } from 'utils/string' +import type { SEOHeadProps } from 'components/SEOHead' + +const V4V5ProjectProviders = dynamic( + () => import('packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectProviders'), + { ssr: false }, +) +const V4V5ProjectDashboard = dynamic( + () => import('packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectDashboard'), + { ssr: false }, +) + +export const getStaticPaths: GetStaticPaths = async () => { + // TODO: static paths is convoluted with chains, needs some thought + // if (process.env.BUILD_CACHE_V5_PROJECTS === 'true') { + // const projects = await paginateDepleteProjectsQueryCall({ + // variables: { where: { pv: PV_V6 } }, + // }) + // const paths = projects.map(({ projectId }) => ({ + // params: { projectId: String(projectId) }, + // })) + // return { paths, fallback: true } + // } + + // TODO: We are switching to blocking as blocking fallback as its just not + // working. Need to investigate further + return { + paths: [], + fallback: 'blocking', + } +} + +export const getStaticProps: GetStaticProps< + ProjectPageProps & { i18n: unknown; seoProps?: SEOHeadProps } +> = async context => { + const locale = context.locale as string + const messages = await loadCatalog(locale) + const i18n = { locale, messages } + + if (!context.params) throw new Error('params not supplied') + + const { projectId, chainId } = jbUrn(context.params.jbUrn as string) ?? {} + + const props = (await getProjectStaticProps( + Number(projectId), + PV_V6, + chainId, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + )) as any + if (props?.props) { + props.props.i18n = i18n + + // Generate SEO props for _app.tsx to render + if (props.props.metadata && chainId && projectId) { + const urn = toJbUrn(chainId, BigInt(projectId)) + const metadata = props.props.metadata + const projectImage = metadata?.logoUri + ? ipfsPublicGatewayUrl(cidFromUrl(metadata.logoUri)) + : undefined + const description = metadata?.projectTagline + ? metadata.projectTagline + : metadata?.description + ? stripHtmlTags(metadata.description) + : undefined + + props.props.seoProps = { + title: metadata?.name, + url: `${SiteBaseUrl}v6/${urn}`, + twitterCard: 'summary_large_image' as const, + ...(description && { description }), + ...(projectImage && { image: projectImage }), + ...(metadata?.twitter && { twitterCreator: metadata.twitter }), + } + } + } + + return { + ...props, + revalidate: 10, // 10 seconds https://nextjs.org/docs/api-reference/data-fetching/get-static-props#revalidate + } +} + +// This is a hack to avoid SSR for now. At the moment when this is not applied to this page, you will see a rehydration error. +const _Wrapper: React.FC = ({ children }) => { + const [hasMounted, setHasMounted] = React.useState(false) + React.useEffect(() => { + setHasMounted(true) + }, []) + + if (!hasMounted) { + return null + } + + if (!featureFlagEnabled(FEATURE_FLAGS.V6)) { + return ( +
+ Too early sir. Please come back later. 🫡 +
+ ) + } + + return <>{children} +} + +export default function V5ProjectPage({ + metadata, + projectId, + chainId, +}: InferGetStaticPropsType) { + if (!chainId || !projectId) { + return
Invalid URL
+ } + + return ( + <_Wrapper> + + + + + + + ) +} diff --git a/src/pages/v6/[jbUrn]/settings/[settingsPage].tsx b/src/pages/v6/[jbUrn]/settings/[settingsPage].tsx new file mode 100644 index 0000000000..b8337db129 --- /dev/null +++ b/src/pages/v6/[jbUrn]/settings/[settingsPage].tsx @@ -0,0 +1,27 @@ +import { jbUrn } from '@bananapus/nana-sdk-core' +import { useRouter } from 'next/router' +import { V4V5SettingsProvider } from 'packages/v4v5/contexts/V4V5SettingsProvider' +import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' +import { ProjectSettingsContent } from 'packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsContent' +import { SettingsPageKey } from 'packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsDashboard' +import globalGetServerSideProps from 'utils/next-server/globalGetServerSideProps' + +export default function V5CycleSettingsPage() { + const router = useRouter() + const { settingsPage } = router.query + const { projectId, chainId } = jbUrn(router.query.jbUrn as string) ?? {} + + if (!settingsPage || !projectId || !chainId) return null + + return ( + + + + + + ) +} + +export const getServerSideProps = globalGetServerSideProps \ No newline at end of file diff --git a/src/pages/v6/[jbUrn]/settings/index.tsx b/src/pages/v6/[jbUrn]/settings/index.tsx new file mode 100644 index 0000000000..74a491d12a --- /dev/null +++ b/src/pages/v6/[jbUrn]/settings/index.tsx @@ -0,0 +1,25 @@ +import { jbUrn } from '@bananapus/nana-sdk-core' +import { useRouter } from 'next/router' +import { V4V5SettingsProvider } from 'packages/v4v5/contexts/V4V5SettingsProvider' +import { V4V5VersionProvider } from 'packages/v4v5/contexts/V4V5VersionProvider' +import { ProjectSettingsDashboard } from 'packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsDashboard' +import globalGetServerSideProps from 'utils/next-server/globalGetServerSideProps' + +export default function V5ProjectSettingsPage() { + const router = useRouter() + const { projectId, chainId } = jbUrn(router.query.jbUrn as string) ?? {} + + if (!projectId || !chainId) { + return null + } + + return ( + + + + + + ) +} + +export const getServerSideProps = globalGetServerSideProps \ No newline at end of file diff --git a/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts b/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts index 8c3d7559f6..d88193a7d0 100644 --- a/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts +++ b/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts @@ -15,7 +15,7 @@ import { } from '../shared/v2ProjectDefaultState' import { NftRewardsData, ReduxState } from '../shared/v2ProjectTypes' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { CreatePage } from 'models/createPage' import { NftPostPayModalConfig } from 'models/nftPostPayModal' import { PayoutsSelection } from 'models/payoutsSelection' diff --git a/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts b/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts index 9a82b5b368..caca99a124 100644 --- a/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts +++ b/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts @@ -23,7 +23,7 @@ import { import { CreateState, ProjectState } from './v2ProjectTypes' import { ONE_MILLION } from 'constants/numbers' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { JB721TiersHookFlags } from 'packages/v4v5/models/nfts' import { projectDescriptionTemplate } from 'templates/create/projectDescriptionTemplate' diff --git a/src/redux/slices/v2v3/shared/v2ProjectTypes.ts b/src/redux/slices/v2v3/shared/v2ProjectTypes.ts index aa32fc5d9d..b7e6f0e25e 100644 --- a/src/redux/slices/v2v3/shared/v2ProjectTypes.ts +++ b/src/redux/slices/v2v3/shared/v2ProjectTypes.ts @@ -14,7 +14,7 @@ import { SerializedV2V3FundingCycleMetadata, } from 'packages/v2v3/utils/serializers' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { CreatePage } from 'models/createPage' import { FundingTargetType } from 'models/fundingTargetType' import { NftPostPayModalConfig } from 'models/nftPostPayModal' diff --git a/src/utils/etherscan.ts b/src/utils/etherscan.ts index 43819a4a34..b32b753382 100644 --- a/src/utils/etherscan.ts +++ b/src/utils/etherscan.ts @@ -1,5 +1,5 @@ import { NETWORKS, readNetwork } from 'constants/networks' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { NetworkName } from 'models/networkName' export const etherscanLink = ( diff --git a/src/utils/featureFlags.ts b/src/utils/featureFlags.ts index 01b41f5b4b..685837cb25 100644 --- a/src/utils/featureFlags.ts +++ b/src/utils/featureFlags.ts @@ -21,6 +21,10 @@ const FEATURE_FLAG_DEFAULTS: { mainnet: true, sepolia: true, }, + [FEATURE_FLAGS.V6]: { + mainnet: true, + sepolia: true, + }, } const featureFlagKey = (baseKey: string) => { diff --git a/src/utils/format/formatCurrencyAmount.ts b/src/utils/format/formatCurrencyAmount.ts index 1e67537335..55affc0e7b 100644 --- a/src/utils/format/formatCurrencyAmount.ts +++ b/src/utils/format/formatCurrencyAmount.ts @@ -1,6 +1,6 @@ import { BigNumber } from '@ethersproject/bignumber' import { formatUnits } from '@ethersproject/units' -import { USDC_ADDRESSES } from 'juice-sdk-core' +import { USDC_ADDRESSES } from '@bananapus/nana-sdk-core' import { ETH_TOKEN_ADDRESS } from 'constants/juiceboxTokens' // Build currency mapping from SDK constants diff --git a/src/utils/nftRewards.ts b/src/utils/nftRewards.ts index 40a1db090c..5bf7581606 100644 --- a/src/utils/nftRewards.ts +++ b/src/utils/nftRewards.ts @@ -382,8 +382,10 @@ export function buildJB721TierParams({ } if ( version === JB721DelegateVersion.JB721DELEGATE_V4 || - version === JB721DelegateVersion.JB721DELEGATE_V5 + version === JB721DelegateVersion.JB721DELEGATE_V5 || + version === JB721DelegateVersion.JB721DELEGATE_V6 ) { + // V6 callers convert the result to the v6 tuple shape via jb721TierConfigToV6. return nftRewardTierToJB721TierParamsV4(rewardTier, cid) } diff --git a/src/utils/server/metadata.ts b/src/utils/server/metadata.ts index d7964a4907..7d563c6b91 100644 --- a/src/utils/server/metadata.ts +++ b/src/utils/server/metadata.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { PV_V1, PV_V2, PV_V4, PV_V5 } from 'constants/pv' -import { JBChainId } from 'juice-sdk-core' +import { PV_V1, PV_V2, PV_V4, PV_V5, PV_V6 } from 'constants/pv' +import { JBChainId } from '@bananapus/nana-sdk-core' import { PV } from 'models/pv' import { findProjectMetadata } from './ipfs' @@ -34,5 +34,10 @@ export const getProjectMetadata = async ( './v4v5Metadata' ) return getV5ProjectMetadata(projectId, chainId, '5') + case PV_V6: + const { getV4V5ProjectMetadata: getV6ProjectMetadata } = await import( + './v4v5Metadata' + ) + return getV6ProjectMetadata(projectId, chainId, '6') } } diff --git a/src/utils/server/pages/props.ts b/src/utils/server/pages/props.ts index e56e8aff8b..e2cbb12350 100644 --- a/src/utils/server/pages/props.ts +++ b/src/utils/server/pages/props.ts @@ -1,5 +1,5 @@ import { PV_V2 } from 'constants/pv' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ProjectMetadata } from 'models/projectMetadata' import { PV } from 'models/pv' import { GetStaticPropsResult } from 'next' diff --git a/src/utils/server/v4v5Metadata.ts b/src/utils/server/v4v5Metadata.ts index 2458fe5797..1a8ae59afb 100644 --- a/src/utils/server/v4v5Metadata.ts +++ b/src/utils/server/v4v5Metadata.ts @@ -6,16 +6,16 @@ import { jbDirectoryAbi, jbContractAddress, JBCoreContracts, -} from 'juice-sdk-core' +} from '@bananapus/nana-sdk-core' import { readContract } from 'wagmi/actions' -import { JBChainId } from 'juice-sdk-react' +import { JBChainId } from '@bananapus/nana-sdk-react' import { wagmiConfig } from 'contexts/Para/Providers' import { PublicClient } from 'viem' export const getV4V5ProjectMetadata = async ( projectId: string | number, chainId?: JBChainId | undefined, - version: '4' | '5' = '4', + version: '4' | '5' | '6' = '4', ) => { if (typeof projectId === 'string') { projectId = Number(projectId) @@ -30,7 +30,7 @@ export const getV4V5ProjectMetadata = async ( const V4V5GetMetadataCidFromContract = async ( projectId: number, chainId: JBChainId, - version: '4' | '5' = '4', + version: '4' | '5' | '6' = '4', ) => { if (!chainId) throw new Error('Chain id not found for chain') const directoryAddress = jbContractAddress[version][JBCoreContracts.JBDirectory][chainId] diff --git a/src/utils/sgDbProjects.ts b/src/utils/sgDbProjects.ts index 7d61d2d490..54fce49519 100644 --- a/src/utils/sgDbProjects.ts +++ b/src/utils/sgDbProjects.ts @@ -1,5 +1,5 @@ import { Project } from 'generated/graphql' -import { JBChainId } from 'juice-sdk-core' +import { JBChainId } from '@bananapus/nana-sdk-core' import { ipfsGatewayFetch } from 'lib/api/ipfs' import { DBProject, diff --git a/yarn.lock b/yarn.lock index 93bb94ceda..9eedc08d4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1070,6 +1070,21 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@bananapus/nana-sdk-core@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@bananapus/nana-sdk-core/-/nana-sdk-core-1.0.0.tgz#e822038fae774cdeb1cc20e267e0291d4dc2b542" + integrity sha512-DDsO8aWaRZs7X/36mc1DhNIiZEWC15Lvs1f9NERgfopsSOwuaL8WuacZTJgPJyGM+ip5Lx63CAQV4ckAtOz8og== + dependencies: + bs58 "^5.0.0" + fpnum "^1.0.0" + +"@bananapus/nana-sdk-react@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@bananapus/nana-sdk-react/-/nana-sdk-react-1.0.0.tgz#b2a22d5ed3f8012c187e57cfbe66960032b80ad3" + integrity sha512-KeaMBogfepJSZqrNpvdJkmf7sI66104uHEEXgZ6JnWIayncS/dBZxlkymdDv7kO0N5geZ3rL7qS0LsrDu8CpRA== + dependencies: + graphql-request "^7.2.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -14113,21 +14128,6 @@ jsx-ast-utils@^3.3.5: object.assign "^4.1.4" object.values "^1.1.6" -juice-sdk-core@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/juice-sdk-core/-/juice-sdk-core-2.1.1.tgz#1bab8d86e418c60e35bcc250ce86223608e41e08" - integrity sha512-wbivXVGVWHoNdwJfZVBk9BrdOSc3SywIBf2Tp6fUMwdTe0NOyd6FVz8S4JK+nETP4exbXO/f1IGIUfsuMsKVxw== - dependencies: - bs58 "^5.0.0" - fpnum "^1.0.0" - -juice-sdk-react@5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/juice-sdk-react/-/juice-sdk-react-5.0.2.tgz#02643e0cd70ce60319077da4678f8f1bb193f9e3" - integrity sha512-JrUxLygSYu3sVju9XX1SDtnNlt9gotGjhnRn7k+6UWPLop3PcgGjUoxGCCEid8Bu6y2fjrB2QNUQ0r1V2BWuWA== - dependencies: - graphql-request "^7.2.0" - juice@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/juice/-/juice-10.0.0.tgz#c6b717ded8be4b969f12503ac9cfbd2604d35937"