From 6b0f2a8bb0bca410c64b85f06aa448a0e64f0686 Mon Sep 17 00:00:00 2001 From: Jango Date: Tue, 14 Jul 2026 22:31:10 -0300 Subject: [PATCH 1/3] Add Juicebox V6 support; create flow launches V6 projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SDK moved to @bananapus/nana-sdk-core / @bananapus/nana-sdk-react @1.0.0 (jbContractAddress['6'], canonical-v6 ABIs with version-suffixed V5/V4 exports). - Version plumbing: V4V5VersionProvider detects /v6 routes (bendystraw still authoritative); /v6/[jbUrn] pages; PV6; FEATURE_FLAGS.V6; v6ProjectRoute; v6 approval-hook deadlines; USD currency id via USD_CURRENCY_ID(6). - Create flow launches V6: controller/terminal/prices addresses keyed by version, msg.value = exact JBProjects.creationFee on every v6 launch (direct, 721, Safe, and Relayr omnichain), v6 JBOmnichainDeployer launchProjectFor overloads with inline sucker configuration (parseSuckerDeployerConfig version 6), and the JBRouterTerminalRegistry registered alongside the multi terminal so v6 projects accept any token. Ruleset metadata and 721 configs are dual-keyed so one object encodes correctly under v4/v5 and v6 ABIs (the cash-out scope flag has inverted semantics in v6; 721 tiers gained nested flags/splits and dropped prices). - v4/v5 stay correct after the canonical-ABI flip: edit-ruleset, omnichain edit, NFT rewards resolution (dataHookOf → tiered721HookOf/REVOwner in v6), 721 tier editing, and terminal-fee reads (v6 fee is a constant) all branch per version. - Listing/explore: v6 projects flow through supabase sync, projects view filter, trending/homepage/search cards, and protocol activity with /v6 links. - projectId receipt parsing is now signature-based (project NFT mint Transfer), position-independent across versions and launch paths. Co-Authored-By: Claude Fable 5 --- package.json | 6 +- src/components/EthereumAddress.tsx | 2 +- src/components/EtherscanLink.tsx | 2 +- src/components/Home/HomepageProjectCard.tsx | 17 +- src/components/Navbar/SiteNavigation.tsx | 8 +- .../CyclesPayoutsTab/ConfigurationTable.tsx | 2 +- src/components/ProjectCard.tsx | 13 +- src/components/ProjectPageSEO.tsx | 2 +- .../Projects/ProjectsFilterAndSort.tsx | 11 + src/components/Projects/ProjectsView.tsx | 10 +- .../Projects/TrendingProjectCard.tsx | 17 +- .../ProtocolActivity/ChainFilterButtons.tsx | 2 +- .../ProtocolActivityElement.tsx | 2 +- .../ProtocolActivity/ProtocolActivityList.tsx | 2 +- .../translateEventDataToProtocolPresenter.tsx | 2 +- .../QuickProjectSearchModal.tsx | 18 +- .../VolumeChart/components/TimelineChart.tsx | 2 +- .../VolumeChart/hooks/useProjectTimeline.ts | 2 +- .../common/CoreAppWrapper/CoreAppWrapper.tsx | 4 +- .../modals/IssueErc20TokenModal.tsx | 2 +- src/components/modals/TransactionModal.tsx | 2 +- src/constants/featureFlags.ts | 3 +- src/constants/networks.ts | 2 +- src/constants/pv.ts | 3 +- src/contexts/ProjectOFACProvider.tsx | 2 +- src/contexts/Transaction/TxHistoryContext.ts | 2 +- src/lib/api/supabase/projects/api.ts | 4 +- src/models/JB721Delegate.ts | 66 +++++ src/models/dbProject.ts | 2 +- src/models/pv.ts | 3 +- .../Allocation/AddEditAllocationModal.tsx | 10 +- .../v4v5/components/Allocation/Allocation.tsx | 2 +- .../components/Allocation/AllocationList.tsx | 2 +- .../components/AllocationItemTitle.tsx | 2 +- src/packages/v4v5/components/ChainLogo.tsx | 2 +- src/packages/v4v5/components/ChainSelect.tsx | 2 +- .../v4v5/components/Create/Create.tsx | 2 +- .../ProjectDetails/ProjectDetailsPage.tsx | 2 +- .../pages/ReviewDeploy/ReviewDeployPage.tsx | 12 +- .../components/CreateChainSelectButton.tsx | 2 +- .../ReviewDeploy/components/DeploySuccess.tsx | 8 +- .../LaunchProjectModal/LaunchProjectModal.tsx | 10 +- .../OmnichainTxLoadingContent.tsx | 4 +- .../LaunchProjectModal/TxLoadingContent.tsx | 2 +- .../ProjectDetailsReview.tsx | 2 +- .../components/RulesReview/RulesReview.tsx | 2 +- .../RulesReview/hooks/useRulesReview.ts | 2 +- .../components/SafeQueueSuccess.tsx | 2 +- .../hooks/NFT/useDeployNftProject.ts | 2 +- .../hooks/NFT/useNftProjectLaunchData.ts | 70 ++++- .../hooks/useDeployOmnichainProject.ts | 258 ++++++++++++++++-- .../hooks/useDeployStandardProject.ts | 2 +- .../hooks/useStandardProjectLaunchData.ts | 8 +- .../hooks/DeployProject/useDeployProject.ts | 2 +- .../v4v5/components/FeeTooltipLabel.tsx | 4 +- .../PayoutsTable/ConvertAmountsModal.tsx | 2 +- .../PayoutsTable/PayoutSplitRow.tsx | 2 +- .../components/PayoutsTable/PayoutTitle.tsx | 2 +- .../context/PayoutsTableContext.tsx | 2 +- .../PayoutsTable/hooks/usePayoutsTable.tsx | 2 +- .../ProjectDashboard/ProjectChainSelect.tsx | 2 +- .../FirstCycleCountdownCallout.tsx | 2 +- .../V4V5PayRedeemCard/PayConfiguration.tsx | 2 +- .../PayProjectModal/PayProjectModal.tsx | 4 +- .../components/EditRewardBeneficiary.tsx | 2 +- .../usePayProjectModal/usePayProjectModal.ts | 2 +- .../usePayProjectModal/usePayProjectTx.ts | 6 +- .../hooks/useProjectPaymentTokens.ts | 4 +- .../V4V5PayRedeemCard/RedeemConfiguration.tsx | 4 +- .../V4V5NftCreditsCallouts.tsx | 2 +- .../V4V5PayRedeemCard/V4V5PayRedeemCard.tsx | 6 +- .../components/ProjectHeaderPopupMenu.tsx | 2 +- .../SuccessPayView/SuccessPayView.tsx | 2 +- .../components/SuccessPayCard.tsx | 2 +- .../AddToProjectBalanceForm.tsx | 4 +- .../LaunchProjectPayerModal.tsx | 2 +- .../V4V5ProjectToolsDrawer.tsx | 2 +- .../ProjectDashboard/redux/payRedeemSlice.ts | 2 +- .../QueueSafeEditRulesetTxsModal.tsx | 21 +- .../QueueSafeTransferOwnershipTxsModal.tsx | 2 +- .../QueueSafeLaunchProjectTxsModal.tsx | 2 +- .../QueueSafeTxsModal/QueueSafeTxsModal.tsx | 2 +- .../QueueTransferOwnershipTxsModal.tsx | 2 +- .../v4v5/components/ReservedTokensList.tsx | 2 +- .../SplitItem/JuiceboxProjectBeneficiary.tsx | 2 +- .../SplitItem/ReservedTokensValue.tsx | 2 +- .../SplitList/SplitItem/SplitAmountValue.tsx | 11 +- .../SplitList/SplitItem/SplitItem.tsx | 2 +- .../SplitList/SplitItem/SplitPercentValue.tsx | 2 +- .../v4v5/components/SplitList/SplitList.tsx | 2 +- .../components/V4V5EditReservedTokens.tsx | 2 +- .../V4V5OmnichainTransferOwnershipForm.tsx | 4 +- .../v4v5/components/V4V5ProjectHandleLink.tsx | 2 +- .../DownloadTokenHoldersModal.tsx | 2 +- .../V4V5TokenHoldersModal/HoldersList.tsx | 4 +- .../TokenDistributionChart/TokenPieChart.tsx | 2 +- .../V4V5TokenHoldersModal.tsx | 2 +- .../contexts/RulesetCountdownProvider.tsx | 2 +- .../V4V5NftRewards/V4V5NftRewardsProvider.tsx | 179 +++++++++--- .../contexts/V4V5NftRewards/useNftRewards.ts | 49 ++-- .../contexts/V4V5ProjectMetadataProvider.tsx | 2 +- .../v4v5/contexts/V4V5SettingsProvider.tsx | 4 +- .../contexts/V4V5UserNftCreditsProvider.tsx | 4 +- .../V4V5UserTotalTokensBalanceProvider.tsx | 4 +- .../v4v5/contexts/V4V5VersionProvider.tsx | 9 +- .../transactor/useLaunchProjectWithNftsTx.ts | 59 +++- .../v4v5/hooks/useCurrentRouteChainId.ts | 2 +- .../v4v5/hooks/useDeployOmnichainErc20.ts | 8 +- .../v4v5/hooks/useETHReceivedFromTokens.ts | 6 +- .../v4v5/hooks/useEditProjectDetailsTx.ts | 4 +- src/packages/v4v5/hooks/useEditRulesetTx.ts | 17 +- src/packages/v4v5/hooks/useHasNftRewards.ts | 2 +- .../v4v5/hooks/useJBAllRulesetsCrossChain.ts | 19 +- .../v4v5/hooks/useJBRulesetByChain.ts | 4 +- .../v4v5/hooks/useJBRulesetHistory.ts | 4 +- .../v4v5/hooks/useJBUpcomingRuleset.ts | 4 +- src/packages/v4v5/hooks/useLaunchProjectTx.ts | 80 +++++- .../v4v5/hooks/useNftRewardsEnabledForPay.ts | 2 +- .../hooks/useOmnichainEditProjectDetailsTx.ts | 6 +- .../v4v5/hooks/usePayProjectDisabled.ts | 2 +- src/packages/v4v5/hooks/usePayoutLimit.ts | 6 +- .../v4v5/hooks/usePayoutLimitOfChain.ts | 4 +- .../v4v5/hooks/usePopulateNftUpdateTx.ts | 38 ++- .../v4v5/hooks/usePopulateProjectDetailsTx.ts | 4 +- .../v4v5/hooks/useProjectHasErc20Token.ts | 2 +- .../useProjectRulesetsDiffAcrossChains.ts | 4 +- .../v4v5/hooks/useProposeSafeEditRulesetTx.ts | 17 +- .../hooks/useProposeSafeLaunchProjectTx.ts | 98 +++++-- .../v4v5/hooks/useProposeSafeTransaction.ts | 2 +- .../useProposeSafeTransferOwnershipTx.ts | 6 +- .../hooks/useSuckersPendingReservedTokens.ts | 6 +- .../v4v5/hooks/useSuckersTotalSupply.ts | 6 +- .../v4v5/hooks/useSuckersUnclaimedBalance.ts | 6 +- src/packages/v4v5/hooks/useTerminalFee.ts | 32 +++ .../useTransferOmnichainProjectOwnership.ts | 6 +- .../v4v5/hooks/useTransferOwnershipOnChain.ts | 6 +- .../hooks/useTransferProjectOwnershipTx.ts | 6 +- .../v4v5/hooks/useUpcomingPayoutLimit.ts | 4 +- .../v4v5/hooks/useUsedPayoutLimitOf.ts | 6 +- .../hooks/useV4V5BalanceOfNativeTerminal.ts | 6 +- .../v4v5/hooks/useV4V5CurrentPayoutSplits.ts | 6 +- .../v4v5/hooks/useV4V5IssueErc20TokenTx.ts | 4 +- .../v4v5/hooks/useV4V5ProjectOwnerOf.ts | 6 +- .../v4v5/hooks/useV4V5ProjectTimeline.ts | 2 +- .../v4v5/hooks/useV4V5ReservedSplits.ts | 6 +- .../v4v5/hooks/useV4V5TotalTokenSupply.ts | 4 +- .../v4v5/hooks/useV4V5UpcomingPayoutSplits.ts | 6 +- .../v4v5/hooks/useV4V5WalletHasPermission.ts | 6 +- src/packages/v4v5/models/nfts.ts | 2 +- src/packages/v4v5/models/splits.ts | 2 +- src/packages/v4v5/utils/approvalHooks.ts | 20 +- src/packages/v4v5/utils/contractVersion.ts | 4 +- src/packages/v4v5/utils/currency.ts | 8 +- src/packages/v4v5/utils/distributions.ts | 2 +- src/packages/v4v5/utils/editRuleset.ts | 8 +- .../v4v5/utils/estimateOmnichainGas.ts | 2 +- .../v4v5/utils/launchProjectTransformers.ts | 55 +++- src/packages/v4v5/utils/networks.ts | 2 +- src/packages/v4v5/utils/routes.ts | 15 +- src/packages/v4v5/utils/rulesetDiff.ts | 2 +- src/packages/v4v5/utils/splitToAllocation.ts | 2 +- src/packages/v4v5/utils/v4Splits.ts | 2 +- .../ProjectHeaderStats.tsx | 2 +- .../V4V5ProjectHeader.tsx | 4 +- .../V4V5ProjectProviders.tsx | 2 +- .../V4V5AboutPanel/hooks/useV4V5AboutPanel.ts | 2 +- .../DownloadActivityModal.tsx | 2 +- .../V4V5ActivityPanel/V4V5ActivityList.tsx | 6 +- .../V4V5ActivityPanel/V4V5AnalyticsPanel.tsx | 2 +- .../V4V5TokenHoldersChart.tsx | 2 +- .../activityEventElems/ActivityElement.tsx | 2 +- .../hooks/useDownloadPayments.ts | 4 +- .../models/ActivityEvents.ts | 2 +- .../utils/transformEventsData.ts | 8 +- .../RulesetCrossChainDiffModal.tsx | 2 +- .../V4V5CurrentUpcomingSubPanel.tsx | 2 +- .../V4V5CycleConfigurationDisplayCard.tsx | 2 +- .../V4V5CycleConfigurationPanel.tsx | 2 +- .../V4V5CyclesPayoutsPanel.tsx | 2 +- .../V4V5DistributePayoutsModal.tsx | 8 +- .../V4V5ExportPayoutsCsvItem.tsx | 2 +- .../V4V5PayoutsSubPanel.tsx | 2 +- .../components/RulesetDiffSection.tsx | 2 +- .../CyclesPanelSelectedChainContext.tsx | 2 +- .../CyclesPanelSelectedCycleContext.tsx | 2 +- .../ReservedTokensSelectedChainContext.tsx | 2 +- .../hooks/useV4V5CycleConfigurationPanel.ts | 2 +- .../hooks/useV4V5DistributableAmount.ts | 4 +- .../hooks/useV4V5ExportSplitsToCsv.ts | 4 +- ...useV4V5FormatConfigurationCycleSection.tsx | 4 +- ...V4V5FormatConfigurationExtensionSection.ts | 2 +- ...4V5FormatConfigurationOtherRulesSection.ts | 2 +- .../useV4V5FormatConfigurationTokenSection.ts | 2 +- .../hooks/useV4V5FormatCycleSection.ts | 4 +- .../hooks/useV4V5FormatExtensionSection.ts | 2 +- .../hooks/useV4V5FormatOtherRulesSection.ts | 2 +- .../hooks/useV4V5FormatTokenSection.ts | 4 +- .../hooks/useV4V5PayoutsSubPanel.tsx | 11 +- .../hooks/useV4V5TokenSection.ts | 2 +- .../hooks/useV4V5TreasuryStats.tsx | 2 +- .../NftReward/NftDetails.tsx | 2 +- .../NftReward/RemainingSupplyWithTooltip.tsx | 2 +- .../V4V5TokensPanel/V4V5ClaimTokensModal.tsx | 8 +- .../V4V5DistributeReservedTokensModal.tsx | 8 +- .../V4V5ExportReservedTokensCsvItem.tsx | 2 +- .../V4V5TokensPanel/V4V5MintModal.tsx | 6 +- .../V4V5ReservedTokensSubPanel.tsx | 2 +- .../V4V5SendReservedTokensButton.tsx | 2 +- .../V4V5TokenRedemptionCallout.tsx | 2 +- .../V4V5TokensPanel/V4V5TokensPanel.tsx | 4 +- .../hooks/useV4V5BalanceMenuItemsUserFlags.ts | 6 +- .../hooks/useV4V5ReservedTokensSubPanel.tsx | 6 +- .../hooks/useV4V5TokensPanel.tsx | 4 +- .../hooks/useV4V5YourBalanceMenuItems.tsx | 6 +- .../components/ProjectActivityList.tsx | 2 +- .../hooks/useV4V5CurrentUpcomingSubPanel.ts | 4 +- .../hooks/useV4V5ProjectHeader.ts | 4 +- .../ArchiveProjectSettingsPage.tsx | 4 +- .../CreateErc20TokenSettingsPage.tsx | 4 +- .../DetailsSection/CycleDeadlineDropdown.tsx | 2 +- .../EditCyclePage/EditCycleFormFields.ts | 2 +- .../EditCyclePage/EditCyclePage.tsx | 2 +- .../EditCyclePage/PayoutsSection.tsx | 2 +- .../DiffedJBProjectBeneficiary.tsx | 2 +- .../DiffedSplitFields/DiffedSplitValue.tsx | 2 +- .../DiffedSplits/DiffedSplitList.tsx | 2 +- .../DetailsSection/PayoutLimitValue.tsx | 2 +- .../ReviewConfirmModal/ReviewConfirmModal.tsx | 6 +- .../hooks/useDetailsSectionValues.ts | 2 +- .../hooks/usePayoutsSectionValues.ts | 2 +- .../hooks/useTokensSectionValues.ts | 2 +- .../TokensSection/ReservedTokensField.tsx | 2 +- .../EditCyclePage/TransactionSuccessModal.tsx | 2 +- .../hooks/useEditCycleFormHasError.tsx | 2 +- .../hooks/useLoadEditCycleData.tsx | 4 +- .../hooks/useOmnichainEditCycle.ts | 65 +++-- .../EditNftsPage/EditNftsPage.tsx | 2 +- .../UpdateNftsPage/EditNftsSection.tsx | 6 +- .../components/QueueSafeEditNftsTxsModal.tsx | 2 +- .../useOmnichainUpdateCurrentCollection.ts | 38 ++- .../hooks/useUpdateCurrentCollection.ts | 40 ++- .../ProjectDetailsSettingsPage.tsx | 4 +- .../QueueSafeProjectDetailsTxsModal.tsx | 4 +- .../ProjectSettingsContent.tsx | 2 +- .../ProjectSettingsDashboard.tsx | 2 +- .../ProjectSettingsLayout.tsx | 4 +- .../QueueSafeDeployErc20TxsModal.tsx | 4 +- .../hooks/useSettingsPagePath.ts | 2 +- .../v4/project/[projectId]/sucker-pairs.ts | 13 +- .../[terminalAddress]/jb-terminal-store.ts | 4 +- src/pages/api/projects/index.ts | 2 +- src/pages/api/projects/trending.ts | 2 +- src/pages/create/index.tsx | 2 +- src/pages/v4/[jbUrn]/index.tsx | 2 +- .../v4/[jbUrn]/settings/[settingsPage].tsx | 2 +- src/pages/v4/[jbUrn]/settings/index.tsx | 2 +- src/pages/v5/[jbUrn]/index.tsx | 2 +- .../v5/[jbUrn]/settings/[settingsPage].tsx | 2 +- src/pages/v5/[jbUrn]/settings/index.tsx | 2 +- src/pages/v6/[jbUrn]/index.tsx | 138 ++++++++++ .../v6/[jbUrn]/settings/[settingsPage].tsx | 27 ++ src/pages/v6/[jbUrn]/settings/index.tsx | 25 ++ .../creatingV2Project/creatingV2Project.ts | 2 +- .../v2v3/shared/v2ProjectDefaultState.ts | 2 +- .../slices/v2v3/shared/v2ProjectTypes.ts | 2 +- src/utils/etherscan.ts | 2 +- src/utils/featureFlags.ts | 4 + src/utils/format/formatCurrencyAmount.ts | 2 +- src/utils/nftRewards.ts | 4 +- src/utils/server/metadata.ts | 9 +- src/utils/server/pages/props.ts | 2 +- src/utils/server/v4v5Metadata.ts | 8 +- src/utils/sgDbProjects.ts | 2 +- yarn.lock | 30 +- 274 files changed, 1712 insertions(+), 654 deletions(-) create mode 100644 src/packages/v4v5/hooks/useTerminalFee.ts create mode 100644 src/pages/v6/[jbUrn]/index.tsx create mode 100644 src/pages/v6/[jbUrn]/settings/[settingsPage].tsx create mode 100644 src/pages/v6/[jbUrn]/settings/index.tsx 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/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..f3ae16dc03 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx @@ -1,5 +1,5 @@ import { Button, Modal } from 'antd' -import { useJBChainId, useJBProjectId } from 'juice-sdk-react' +import { useJBChainId, useJBProjectId } from '@bananapus/nana-sdk-react' import { settingsPagePath, v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' import { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' 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..604d14f60e 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx @@ -1,8 +1,8 @@ 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 { useV4V5Version } from 'packages/v4v5/contexts/V4V5VersionProvider' 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..d42a4e9a6b 100644 --- a/src/pages/create/index.tsx +++ b/src/pages/create/index.tsx @@ -29,7 +29,7 @@ const V4V5VersionProvider = dynamic( export default function CreatePage() { const contentByVersion = featureFlagEnabled(FEATURE_FLAGS.V4) ? ( - + ) : ( 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..4b564bd3d0 --- /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}v5/${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" From 528c131a1de5f859a0faae12fed37810f668065a Mon Sep 17 00:00:00 2001 From: Jango Date: Tue, 14 Jul 2026 22:49:12 -0300 Subject: [PATCH 2/3] i18n: extract messages Co-Authored-By: Claude Fable 5 --- src/locales/messages.pot | 3 +++ 1 file changed, 3 insertions(+) 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 "" From 515c490d50e8dc980379e209dbc5ffa11b293135 Mon Sep 17 00:00:00 2001 From: Jango Date: Tue, 14 Jul 2026 23:10:34 -0300 Subject: [PATCH 3/3] Fix v6 route regressions found in review - Settings close/success links routed v6 (and any non-5) projects to /v4; use v4v5ProjectRoute with the context version. - The v6 project page's SEO/og URL advertised the /v5 route. - The create page gate now matches the v6 pages' feature flag. Co-Authored-By: Claude Fable 5 --- .../EditCyclePage/TransactionSuccessModal.tsx | 11 ++++++----- .../V4V5ProjectSettings/ProjectSettingsLayout.tsx | 11 ++++++----- src/pages/create/index.tsx | 2 +- src/pages/v6/[jbUrn]/index.tsx | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/EditCyclePage/TransactionSuccessModal.tsx index f3ae16dc03..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 '@bananapus/nana-sdk-react' -import { settingsPagePath, v4ProjectRoute, v5ProjectRoute } from 'packages/v4v5/utils/routes' +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/ProjectSettingsLayout.tsx b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx index 604d14f60e..91f6744278 100644 --- a/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx +++ b/src/packages/v4v5/views/V4V5ProjectSettings/ProjectSettingsLayout.tsx @@ -4,7 +4,7 @@ import { useJBChainId, useJBContractContext } from '@bananapus/nana-sdk-react' import { Trans } from '@lingui/macro' 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/pages/create/index.tsx b/src/pages/create/index.tsx index d42a4e9a6b..66b609a38c 100644 --- a/src/pages/create/index.tsx +++ b/src/pages/create/index.tsx @@ -28,7 +28,7 @@ const V4V5VersionProvider = dynamic( ) export default function CreatePage() { - const contentByVersion = featureFlagEnabled(FEATURE_FLAGS.V4) ? ( + const contentByVersion = featureFlagEnabled(FEATURE_FLAGS.V6) ? ( diff --git a/src/pages/v6/[jbUrn]/index.tsx b/src/pages/v6/[jbUrn]/index.tsx index 4b564bd3d0..b873472947 100644 --- a/src/pages/v6/[jbUrn]/index.tsx +++ b/src/pages/v6/[jbUrn]/index.tsx @@ -80,7 +80,7 @@ export const getStaticProps: GetStaticProps< props.props.seoProps = { title: metadata?.name, - url: `${SiteBaseUrl}v5/${urn}`, + url: `${SiteBaseUrl}v6/${urn}`, twitterCard: 'summary_large_image' as const, ...(description && { description }), ...(projectImage && { image: projectImage }),