From ec6d29a6b4def976f7bbc1df60ee0600a4ce2426 Mon Sep 17 00:00:00 2001 From: Johnny D Date: Sat, 11 Jan 2025 16:33:44 +1100 Subject: [PATCH] feat: links to projects other chain instances + multichain surplus (#4573) --- public/assets/images/chain-logos/arbitrum.svg | 1 + public/assets/images/chain-logos/base.svg | 4 ++ public/assets/images/chain-logos/mainnet.svg | 1 + public/assets/images/chain-logos/optimism.svg | 1 + src/constants/networks.ts | 42 ++++++++++-- src/hooks/Wallet/hooks/useChangeNetworks.ts | 7 +- src/locales/messages.pot | 15 ++--- src/models/networkName.ts | 6 +- .../hooks/useLoadInitialStateFromQuery.ts | 22 +++---- src/packages/v4/components/ChainLogo.tsx | 31 +++++++++ .../ProjectDetails/ProjectChainSelect.tsx | 25 ++++---- .../hooks/useProjectDetailsForm.ts | 4 +- .../hooks/useLoadInitialStateFromQuery.ts | 22 +++---- .../PayProjectModal/PayProjectModal.tsx | 17 ++--- .../transactor/useLaunchProjectWithNftsTx.ts | 39 +++++------ .../V4ProjectDashboard/V4ProjectHeader.tsx | 43 +++++++++---- .../V4CyclesPayoutsPanel/V4TreasuryStats.tsx | 15 +++-- .../hooks/useV4TreasuryStats.tsx | 64 ++++++++++++++----- .../creatingV2Project/creatingV2Project.ts | 24 +++---- .../v2v3/shared/v2ProjectDefaultState.ts | 2 +- .../slices/v2v3/shared/v2ProjectTypes.ts | 3 +- 21 files changed, 258 insertions(+), 130 deletions(-) create mode 100644 public/assets/images/chain-logos/arbitrum.svg create mode 100644 public/assets/images/chain-logos/base.svg create mode 100644 public/assets/images/chain-logos/mainnet.svg create mode 100644 public/assets/images/chain-logos/optimism.svg create mode 100644 src/packages/v4/components/ChainLogo.tsx diff --git a/public/assets/images/chain-logos/arbitrum.svg b/public/assets/images/chain-logos/arbitrum.svg new file mode 100644 index 0000000000..1f67712a2c --- /dev/null +++ b/public/assets/images/chain-logos/arbitrum.svg @@ -0,0 +1 @@ + diff --git a/public/assets/images/chain-logos/base.svg b/public/assets/images/chain-logos/base.svg new file mode 100644 index 0000000000..3f648c128a --- /dev/null +++ b/public/assets/images/chain-logos/base.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/images/chain-logos/mainnet.svg b/public/assets/images/chain-logos/mainnet.svg new file mode 100644 index 0000000000..182a682b84 --- /dev/null +++ b/public/assets/images/chain-logos/mainnet.svg @@ -0,0 +1 @@ + diff --git a/public/assets/images/chain-logos/optimism.svg b/public/assets/images/chain-logos/optimism.svg new file mode 100644 index 0000000000..970874cb38 --- /dev/null +++ b/public/assets/images/chain-logos/optimism.svg @@ -0,0 +1 @@ + diff --git a/src/constants/networks.ts b/src/constants/networks.ts index 65d288cccf..1755fc64e3 100644 --- a/src/constants/networks.ts +++ b/src/constants/networks.ts @@ -9,7 +9,7 @@ type NetworkInfo = { name: NetworkName label: string color: string - chainId: number + chainId: number, // should be JBChainId blockExplorer: string rpcUrl: string token: string @@ -57,6 +57,15 @@ export const NETWORKS: Record = { rpcUrl: `https://sepolia-rollup.arbitrum.io/rpc`, blockExplorer: 'https://sepolia-explorer.arbitrum.io', }, + 10: { + name: NetworkName.optimism, + label: 'Optimism', + color: '#ff0420', + chainId: 10, + token: 'OpETH', + rpcUrl: `https://optimism-mainnet.infura.io/v3/${infuraId}`, + blockExplorer: 'https://optimistic.etherscan.io', + }, 11155420: { name: NetworkName.optimismSepolia, label: 'Optimism Sepolia Testnet', @@ -66,6 +75,15 @@ export const NETWORKS: Record = { rpcUrl: `https://sepolia.optimism.io`, blockExplorer: 'https://optimism-sepolia.blockscout.com', }, + 8453: { + name: NetworkName.base, + label: 'Base', + color: '#00d395', + chainId: 8453, + token: 'BaseETH', + rpcUrl: `https://mainnet.base.org`, + blockExplorer: 'https://basescan.org', + }, 84532: { name: NetworkName.baseSepolia, label: 'Base Sepolia', @@ -75,11 +93,27 @@ export const NETWORKS: Record = { rpcUrl: `https://sepolia.base.org`, blockExplorer: 'https://sepolia.basescan.org', }, + 137: { + name: NetworkName.polygon, + label: 'Polygon', + color: '#8247e5', + chainId: 137, + token: 'MATIC', + rpcUrl: `https://polygon-mainnet.infura.io/v3/${infuraId}`, + blockExplorer: 'https://polygonscan.com', + }, + 1442: { + name: NetworkName.polygonSepolia, + label: 'Polygon Sepolia Testnet', + color: '#9f7bea', + chainId: 1442, + token: 'MATIC', + rpcUrl: `https://sepolia-polygon.io/rpc`, + blockExplorer: 'https://sepolia.polygonscan.com', + }, } -export const TESTNET_IDS = new Set([11155111, 421614, 11155420, 84531]) - -export type SupportedChainId = keyof typeof NETWORKS; +export const TESTNET_IDS = new Set([11155111, 421614, 11155420, 84531, 1442]); export const NETWORKS_BY_NAME = Object.values(NETWORKS).reduce( (acc, curr) => ({ diff --git a/src/hooks/Wallet/hooks/useChangeNetworks.ts b/src/hooks/Wallet/hooks/useChangeNetworks.ts index e21c1f5211..2d3e187ad9 100644 --- a/src/hooks/Wallet/hooks/useChangeNetworks.ts +++ b/src/hooks/Wallet/hooks/useChangeNetworks.ts @@ -1,7 +1,6 @@ -import { SupportedChainId, readNetwork } from 'constants/networks' - -import { useCallback } from 'react' import { useSetChain } from '@web3-onboard/react' +import { readNetwork } from 'constants/networks' +import { useCallback } from 'react' /** * Attempts to sync the user wallet's chain with the readNetwork (hard-coded per environment) @@ -10,7 +9,7 @@ import { useSetChain } from '@web3-onboard/react' export function useChangeNetworks() { const [{ chains }, setChain] = useSetChain() - const changeNetworks = useCallback(async (chainId?: SupportedChainId) => { + const changeNetworks = useCallback(async (chainId?: number) => { // should be JBChainId const chain = chains.find(c => Number(c.id) === (chainId ?? readNetwork.chainId)) if (!chain) { console.error('FATAL: Chain not found') diff --git a/src/locales/messages.pot b/src/locales/messages.pot index 4279a18eef..40a61367d7 100644 --- a/src/locales/messages.pot +++ b/src/locales/messages.pot @@ -77,9 +77,6 @@ msgstr "" msgid "Contract address: {0}" msgstr "" -msgid "No surplus" -msgstr "" - msgid "Trust" msgstr "" @@ -386,9 +383,6 @@ msgstr "" msgid "Basic details" msgstr "" -msgid "{surplus} is available for future payouts." -msgstr "" - msgid "Your project can receive payments through the juicebox.money app." msgstr "" @@ -1076,9 +1070,6 @@ msgstr "" msgid "1. Set ENS name" msgstr "" -msgid "{surplus} is available for token redemptions or future payouts." -msgstr "" - msgid "No overflow" msgstr "" @@ -1475,6 +1466,9 @@ msgstr "" msgid "File" msgstr "" +msgid "{surplusElement} is available across all chains for token redemptions or future payouts." +msgstr "" + msgid "You have <0>{0} ETH of unclaimed NFT credits" msgstr "" @@ -3272,6 +3266,9 @@ msgstr "" msgid "Owner token minting is not available for V1.0 projects. Owner token minting can be enabled by editing the project's cycle." msgstr "" +msgid "{surplusElement} is available across all chains for future payouts." +msgstr "" + msgid "<0/> reclaimed from project" msgstr "" diff --git a/src/models/networkName.ts b/src/models/networkName.ts index 8dceae7436..5da93862e7 100644 --- a/src/models/networkName.ts +++ b/src/models/networkName.ts @@ -2,8 +2,12 @@ export enum NetworkName { localhost = 'localhost', mainnet = 'mainnet', sepolia = 'sepolia', + arbitrumOne = 'arbitrumOne', arbitrumSepolia = 'arbitrumSepolia', + optimism = 'optimism', optimismSepolia = 'optimismSepolia', - arbitrumOne = 'arbitrumOne', + base = 'base', baseSepolia = 'baseSepolia', + polygon = 'polygon', + polygonSepolia = 'polygonSepolia', } diff --git a/src/packages/v2v3/components/Create/hooks/useLoadInitialStateFromQuery.ts b/src/packages/v2v3/components/Create/hooks/useLoadInitialStateFromQuery.ts index a3a37ad0f7..677dc941fe 100644 --- a/src/packages/v2v3/components/Create/hooks/useLoadInitialStateFromQuery.ts +++ b/src/packages/v2v3/components/Create/hooks/useLoadInitialStateFromQuery.ts @@ -1,25 +1,25 @@ -import { CreateState, ProjectState } from 'redux/slices/v2v3/shared/v2ProjectTypes' +import { useEffect, useState } from 'react' import { DEFAULT_REDUX_STATE, creatingV2ProjectActions, } from 'redux/slices/v2v3/creatingV2Project' -import { useEffect, useState } from 'react' +import { CreateState, ProjectState } from 'redux/slices/v2v3/shared/v2ProjectTypes' -import { CreatePage } from 'models/createPage' -import { DefaultSettings as DefaultTokenSettings } from '../components/pages/ProjectToken/hooks/useProjectTokenForm' import { ETH_TOKEN_ADDRESS } from 'constants/juiceboxTokens' -import { INITIAL_REDUX_STATE } from 'redux/slices/v2v3/shared/v2ProjectInitialReduxState' -import { MAX_DISTRIBUTION_LIMIT } from 'packages/v2v3/utils/math' +import isEqual from 'lodash/isEqual' +import { CreatePage } from 'models/createPage' import { ProjectTokensSelection } from 'models/projectTokenSelection' import { TreasurySelection } from 'models/treasurySelection' +import { useRouter } from 'next/router' import { ballotStrategiesFn } from 'packages/v2v3/constants/ballotStrategies' -import isEqual from 'lodash/isEqual' +import { useDefaultJBETHPaymentTerminal } from 'packages/v2v3/hooks/defaultContracts/useDefaultJBETHPaymentTerminal' +import { MAX_DISTRIBUTION_LIMIT } from 'packages/v2v3/utils/math' +import { useDispatch } from 'react-redux' +import { INITIAL_REDUX_STATE } from 'redux/slices/v2v3/shared/v2ProjectInitialReduxState' import { isEqualAddress } from 'utils/address' import { parseWad } from 'utils/format/formatNumber' +import { DefaultSettings as DefaultTokenSettings } from '../components/pages/ProjectToken/hooks/useProjectTokenForm' import { projectTokenSettingsToReduxFormat } from '../utils/projectTokenSettingsToReduxFormat' -import { useDefaultJBETHPaymentTerminal } from 'packages/v2v3/hooks/defaultContracts/useDefaultJBETHPaymentTerminal' -import { useDispatch } from 'react-redux' -import { useRouter } from 'next/router' const ReduxDefaultTokenSettings = projectTokenSettingsToReduxFormat(DefaultTokenSettings) @@ -101,7 +101,7 @@ const parseCreateFlowStateFromInitialState = ( } return { - projectChainId: 0, // not necessary for v2v3 + projectChainId: 84532, // not necessary for v2v3 fundingCyclesPageSelection, treasurySelection, fundingTargetSelection: undefined, // TODO: Remove diff --git a/src/packages/v4/components/ChainLogo.tsx b/src/packages/v4/components/ChainLogo.tsx new file mode 100644 index 0000000000..21b615075e --- /dev/null +++ b/src/packages/v4/components/ChainLogo.tsx @@ -0,0 +1,31 @@ +import Image from "next/image"; +import { JBChainId } from "juice-sdk-react"; +import { NETWORKS } from "constants/networks"; + +const chainIdToLogo: Record = { + 1: "/assets/images/chain-logos/mainnet.svg", + 11155111: "/assets/images/chain-logos/mainnet.svg", + 42161: "/assets/images/chain-logos/arbitrum.svg", + 421614: "/assets/images/chain-logos/arbitrum.svg", + 11155420: "/assets/images/chain-logos/optimism.svg", + 84532: "/assets/images/chain-logos/base.svg", +}; + +export const ChainLogo = ({ + chainId, + width, + height, +}: { + chainId: JBChainId; + width?: number; + height?: number; +}) => { + return ( + {`${NETWORKS[chainId].label} + ); +}; diff --git a/src/packages/v4/components/Create/components/pages/ProjectDetails/ProjectChainSelect.tsx b/src/packages/v4/components/Create/components/pages/ProjectDetails/ProjectChainSelect.tsx index d27788fc22..3487b916e2 100644 --- a/src/packages/v4/components/Create/components/pages/ProjectDetails/ProjectChainSelect.tsx +++ b/src/packages/v4/components/Create/components/pages/ProjectDetails/ProjectChainSelect.tsx @@ -1,22 +1,21 @@ -import { - DEFAULT_PROJECT_CHAIN_ID, - NETWORKS, - SupportedChainId, -} from 'constants/networks' +import { DEFAULT_PROJECT_CHAIN_ID, NETWORKS } from "constants/networks" -import { JuiceListbox } from 'components/inputs/JuiceListbox' +import { JuiceListbox } from "components/inputs/JuiceListbox" +import { JBChainId } from "juice-sdk-react" export const ProjectChainSelect: React.FC< React.PropsWithChildren<{ - value?: SupportedChainId - onChange?: (value: SupportedChainId) => void + value?: JBChainId + onChange?: (value: JBChainId) => void }> > = ({ value, onChange }) => { - const networkOptions = () => - Object.entries(NETWORKS).map(([chainId, networkInfo]) => ({ - label: networkInfo.label, - value: parseInt(chainId), - })) + + const networkOptions = () => Object.entries(NETWORKS).map( + ([chainId, networkInfo]) => ({ + label: networkInfo.label, + value: parseInt(chainId) as JBChainId, + }) + ) return ( { const { @@ -49,7 +50,7 @@ export const PayProjectModal: React.FC = () => { const walletConnectedToWrongChain = walletChain?.id && values.chainId !== parseInt(walletChain.id) if (walletConnectedToWrongChain) { - await changeNetworks(values.chainId) + await changeNetworks(values.chainId as JBChainId) return } if (!walletChain) { diff --git a/src/packages/v4/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts b/src/packages/v4/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts index a1659580b4..d07774baa1 100644 --- a/src/packages/v4/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts +++ b/src/packages/v4/hooks/JB721Delegate/transactor/useLaunchProjectWithNftsTx.ts @@ -1,12 +1,15 @@ -import { waitForTransactionReceipt } from '@wagmi/core' -import { JUICEBOX_MONEY_PROJECT_METADATA_DOMAIN } from 'constants/metadataDomain' -import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' -import { useWallet } from 'hooks/Wallet' +import { + Address, + WaitForTransactionReceiptReturnType, + toBytes, + toHex, + zeroAddress, +} from 'viem' import { DEFAULT_MEMO, - jbProjectDeploymentAddresses, NATIVE_TOKEN, NATIVE_TOKEN_DECIMALS, + jbProjectDeploymentAddresses, } from 'juice-sdk-core' import { JBChainId, @@ -14,28 +17,26 @@ import { useJBContractContext, useWriteJb721TiersHookProjectDeployerLaunchProjectFor, } from 'juice-sdk-react' -import { isValidMustStartAtOrAfter } from 'packages/v2v3/utils/fundingCycle' import { JBDeploy721TiersHookConfig, LaunchProjectWithNftsTxArgs, } from 'packages/v4/models/nfts' -import { wagmiConfig } from 'packages/v4/wagmiConfig' -import { useContext } from 'react' -import { DEFAULT_MUST_START_AT_OR_AFTER } from 'redux/slices/v2v3/shared/v2ProjectDefaultState' -import { ipfsUri } from 'utils/ipfs' -import { - Address, - toBytes, - toHex, - WaitForTransactionReceiptReturnType, - zeroAddress, -} from 'viem' -import { useChainId } from 'wagmi' import { LaunchV2V3ProjectArgs, transformV2V3CreateArgsToV4, } from '../../../utils/launchProjectTransformers' + +import { DEFAULT_MUST_START_AT_OR_AFTER } from 'redux/slices/v2v3/shared/v2ProjectDefaultState' +import { JUICEBOX_MONEY_PROJECT_METADATA_DOMAIN } from 'constants/metadataDomain' import { LaunchTxOpts } from '../../useLaunchProjectTx' +import { TxHistoryContext } from 'contexts/Transaction/TxHistoryContext' +import { ipfsUri } from 'utils/ipfs' +import { isValidMustStartAtOrAfter } from 'packages/v2v3/utils/fundingCycle' +import { useChainId } from 'wagmi' +import { useContext } from 'react' +import { useWallet } from 'hooks/Wallet' +import { wagmiConfig } from 'packages/v4/wagmiConfig' +import { waitForTransactionReceipt } from '@wagmi/core' /** * Return the project ID created from a `launchProjectFor` transaction. @@ -193,7 +194,7 @@ export function useLaunchProjectWithNftsTx() { // }) const hash = await writeLaunchProject({ - chainId: chainId as 84532 | 421614 | 11155111 | 11155420, // TODO: cleanup + chainId: chainId as JBChainId, args, }) diff --git a/src/packages/v4/views/V4ProjectDashboard/V4ProjectHeader.tsx b/src/packages/v4/views/V4ProjectDashboard/V4ProjectHeader.tsx index 886015608e..4f5780e3bd 100644 --- a/src/packages/v4/views/V4ProjectDashboard/V4ProjectHeader.tsx +++ b/src/packages/v4/views/V4ProjectDashboard/V4ProjectHeader.tsx @@ -1,32 +1,35 @@ import { Button, Divider } from 'antd' +import { JBChainId, useJBChainId, useSuckers } from 'juice-sdk-react' import { settingsPagePath, v4ProjectRoute } from 'packages/v4/utils/routes' -import { Badge } from 'components/Badge' import { Cog6ToothIcon } from '@heroicons/react/24/outline' +import { Trans } from '@lingui/macro' +import { Badge } from 'components/Badge' import EthereumAddress from 'components/EthereumAddress' import { GnosisSafeBadge } from 'components/Project/ProjectHeader/GnosisSafeBadge' -import Link from 'next/link' import { ProjectHeaderLogo } from 'components/Project/ProjectHeader/ProjectHeaderLogo' -import { ProjectHeaderPopupMenu } from 'packages/v4/components/ProjectDashboard/components/ProjectHeaderPopupMenu' -import { ProjectHeaderStats } from './ProjectHeaderStats' import { SocialLinkButton } from 'components/Project/ProjectHeader/SocialLinkButton' -import { Trans } from '@lingui/macro' -// import { Subtitle } from 'components/Project/ProjectHeader/Subtitle' import { TruncatedText } from 'components/TruncatedText' -import { V4OperatorPermission } from 'packages/v4/models/v4Permissions' +import useMobile from 'hooks/useMobile' +import { SuckerPair } from 'juice-sdk-core' +import Link from 'next/link' +import { ChainLogo } from 'packages/v4/components/ChainLogo' +import { ProjectHeaderPopupMenu } from 'packages/v4/components/ProjectDashboard/components/ProjectHeaderPopupMenu' import V4ProjectHandleLink from 'packages/v4/components/V4ProjectHandleLink' +import { V4OperatorPermission } from 'packages/v4/models/v4Permissions' import { twMerge } from 'tailwind-merge' -import { useJBChainId } from 'juice-sdk-react' -import useMobile from 'hooks/useMobile' +import { ProjectHeaderStats } from './ProjectHeaderStats' +// import { Subtitle } from 'components/Project/ProjectHeader/Subtitle' import { useSocialLinks } from 'components/Project/ProjectHeader/hooks/useSocialLinks' -import { useV4ProjectHeader } from './hooks/useV4ProjectHeader' import { useV4WalletHasPermission } from 'packages/v4/hooks/useV4WalletHasPermission' +import { useV4ProjectHeader } from './hooks/useV4ProjectHeader' export type SocialLink = 'twitter' | 'discord' | 'telegram' | 'website' export const V4ProjectHeader = ({ className }: { className?: string }) => { const socialLinks = useSocialLinks() const chainId = useJBChainId() + const { data: suckers } = useSuckers() as { data: SuckerPair[] } const { title, @@ -94,10 +97,28 @@ export const V4ProjectHeader = ({ className }: { className?: string }) => {
-
+

{title}

+
+ {suckers?.map((pair) => { + if (!pair || !pair?.peerChainId || !pair?.projectId) return null; + return ( + + + + ); + })} +
{archived ? Archived : null} diff --git a/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/V4TreasuryStats.tsx b/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/V4TreasuryStats.tsx index 52109a30fe..f8b1a30f9b 100644 --- a/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/V4TreasuryStats.tsx +++ b/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/V4TreasuryStats.tsx @@ -1,26 +1,27 @@ import { Trans, t } from '@lingui/macro' import { - availableToPayOutTooltip, - treasuryBalanceTooltip, + availableToPayOutTooltip, + treasuryBalanceTooltip, } from 'components/Project/ProjectTabs/CyclesPayoutsTab/CyclesPanelTooltips' + import { TitleDescriptionDisplayCard } from 'components/Project/ProjectTabs/TitleDescriptionDisplayCard' import { useMemo } from 'react' import { useV4TreasuryStats } from './hooks/useV4TreasuryStats' export const V4TreasuryStats = () => { - const { availableToPayout, surplus, treasuryBalance, cashOutTaxRate } = + const { availableToPayout, surplusElement, treasuryBalance, cashOutTaxRate } = useV4TreasuryStats() const surplusTooltip = useMemo( () => cashOutTaxRate && cashOutTaxRate.toFloat() > 0 ? ( - {surplus} is available for token redemptions or future payouts. + {surplusElement} is available across all chains for token redemptions or future payouts. ) : ( - {surplus} is available for future payouts. + {surplusElement} is available across all chains for future payouts. ), - [surplus, cashOutTaxRate], + [surplusElement, cashOutTaxRate], ) return ( @@ -34,7 +35,7 @@ export const V4TreasuryStats = () => { { const { data: rulesetMetadata } = useJBRulesetMetadata() const { distributableAmount } = useV4DistributableAmount() - const { data: surplusInNativeToken } = useNativeTokenSurplus() const { data: _treasuryBalance } = useV4BalanceOfNativeTerminal() - const { data: payoutLimit } = usePayoutLimit() + const surplusQuery = useSuckersNativeTokenSurplus(); - const treasuryBalance = + // NOTE: if loading state or conversion to USD necessary + // const { data: ethPrice, isLoading: isEthLoading } = useEtherPrice(); + // const loading = isEthLoading || surplusQuery.isLoading; - const surplus = useMemo(() => { - if (payoutLimit && payoutLimit.amount === MAX_PAYOUT_LIMIT) - return t`No surplus` + const ethSurplusByChain = surplusQuery?.data + const totalEthSurplus = + ethSurplusByChain?.reduce((acc, curr) => { + return acc + curr.surplus; + }, 0n) ?? 0n; + + const treasuryBalance = - return - }, [surplusInNativeToken, payoutLimit]) + const surplusElement = useMemo(() => { + // NOTE: Don't think we need this since other chains payouts limits may be different? + // if (payoutLimit && payoutLimit.amount === MAX_PAYOUT_LIMIT) + // return t`No surplus` + return ( + 0 ? +
+ {ethSurplusByChain?.map((surplus, index) => ( +
+
+ + {NETWORKS[surplus.chainId].label} +
+ {/* (NOTE: Following comment copied from Revnet: + "TODO maybe show USD-converted value here instead?" */} + + + +
+ ))} + +
+ : undefined} + > + +
+ ) + }, [totalEthSurplus, ethSurplusByChain]) const availableToPayout = return { treasuryBalance, availableToPayout, - surplus, + surplusElement, cashOutTaxRate: rulesetMetadata?.cashOutTaxRate, } } diff --git a/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts b/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts index e791046704..c13e033051 100644 --- a/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts +++ b/src/redux/slices/v2v3/creatingV2Project/creatingV2Project.ts @@ -1,32 +1,32 @@ -import { - EMPTY_PAYOUT_GROUPED_SPLITS, - EMPTY_RESERVED_TOKENS_GROUPED_SPLITS, -} from '../shared/v2ProjectDefaultState' +import { PayloadAction, createSlice } from '@reduxjs/toolkit' import { JB721GovernanceType, NftCollectionMetadata, NftRewardTier, } from 'models/nftRewards' -import { NftRewardsData, ReduxState } from '../shared/v2ProjectTypes' -import { PayloadAction, createSlice } from '@reduxjs/toolkit' import { SerializedV2V3FundAccessConstraint, SerializedV2V3FundingCycleData, SerializedV2V3FundingCycleMetadata, } from 'packages/v2v3/utils/serializers' +import { + EMPTY_PAYOUT_GROUPED_SPLITS, + EMPTY_RESERVED_TOKENS_GROUPED_SPLITS, +} from '../shared/v2ProjectDefaultState' +import { NftRewardsData, ReduxState } from '../shared/v2ProjectTypes' -import { AllocationSplit } from 'packages/v2v3/components/shared/Allocation/Allocation' -import { AmountInputValue } from 'packages/v2v3/components/Create/components/pages/ProjectDetails/ProjectDetailsPage' import { CreatePage } from 'models/createPage' -import { INITIAL_REDUX_STATE } from '../shared/v2ProjectInitialReduxState' import { NftPostPayModalConfig } from 'models/nftPostPayModal' import { PayoutsSelection } from 'models/payoutsSelection' import { ProjectTagName } from 'models/project-tags' import { ProjectTokensSelection } from 'models/projectTokenSelection' import { ReconfigurationStrategy } from 'models/reconfigurationStrategy' -import { Split } from 'packages/v2v3/models/splits' import { TreasurySelection } from 'models/treasurySelection' +import { AmountInputValue } from 'packages/v2v3/components/Create/components/pages/ProjectDetails/ProjectDetailsPage' import { projectTokenSettingsToReduxFormat } from 'packages/v2v3/components/Create/utils/projectTokenSettingsToReduxFormat' +import { AllocationSplit } from 'packages/v2v3/components/shared/Allocation/Allocation' +import { Split } from 'packages/v2v3/models/splits' +import { INITIAL_REDUX_STATE } from '../shared/v2ProjectInitialReduxState' const creatingV2ProjectSlice = createSlice({ name: 'creatingV2Project', @@ -39,8 +39,8 @@ const creatingV2ProjectSlice = createSlice({ setName: (state, action: PayloadAction) => { state.projectMetadata.name = action.payload }, - setProjectChainId: (state, action: PayloadAction) => { - state.projectChainId = action.payload + setProjectChainId: (state, action: PayloadAction) => { // v4TODO: Should use JBChainId type + state.projectChainId = action.payload as 84532 | 421614 | 11155111 | 11155420 // shouldn't need this }, setProjectTagline: (state, action: PayloadAction) => { state.projectMetadata.projectTagline = action.payload diff --git a/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts b/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts index a79efdbd4c..b1e794141c 100644 --- a/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts +++ b/src/redux/slices/v2v3/shared/v2ProjectDefaultState.ts @@ -119,7 +119,7 @@ const DEFAULT_PROJECT_METADATA_STATE: ProjectMetadata = { } const DEFAULT_CREATE_STATE: CreateState = { - projectChainId: undefined, // not necessary for v2v3 + projectChainId: 1, // not necessary for v2v3 treasurySelection: 'zero', reconfigurationRuleSelection: undefined, fundingCyclesPageSelection: undefined, diff --git a/src/redux/slices/v2v3/shared/v2ProjectTypes.ts b/src/redux/slices/v2v3/shared/v2ProjectTypes.ts index efc7e44f74..895fa74f6c 100644 --- a/src/redux/slices/v2v3/shared/v2ProjectTypes.ts +++ b/src/redux/slices/v2v3/shared/v2ProjectTypes.ts @@ -14,7 +14,6 @@ import { SerializedV2V3FundingCycleMetadata, } from 'packages/v2v3/utils/serializers' -import { SupportedChainId } from 'constants/networks' import { CreatePage } from 'models/createPage' import { FundingTargetType } from 'models/fundingTargetType' import { NftPostPayModalConfig } from 'models/nftPostPayModal' @@ -37,7 +36,7 @@ export type NftRewardsData = { export interface CreateState { fundingCyclesPageSelection: 'automated' | 'manual' | undefined - projectChainId: SupportedChainId | undefined + projectChainId: number // v4TODO: should be JBChainId treasurySelection: TreasurySelection | undefined fundingTargetSelection: FundingTargetType | undefined payoutsSelection: PayoutsSelection | undefined