Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: links to projects other chain instances + multichain surplus #4573

Merged
merged 2 commits into from
Jan 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions public/assets/images/chain-logos/arbitrum.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions public/assets/images/chain-logos/base.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/assets/images/chain-logos/mainnet.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/assets/images/chain-logos/optimism.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
42 changes: 38 additions & 4 deletions src/constants/networks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -57,6 +57,15 @@ export const NETWORKS: Record<number, NetworkInfo> = {
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',
Expand All @@ -66,6 +75,15 @@ export const NETWORKS: Record<number, NetworkInfo> = {
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',
Expand All @@ -75,11 +93,27 @@ export const NETWORKS: Record<number, NetworkInfo> = {
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<number>([11155111, 421614, 11155420, 84531, 1442]);

export const NETWORKS_BY_NAME = Object.values(NETWORKS).reduce(
(acc, curr) => ({
Expand Down
7 changes: 3 additions & 4 deletions src/hooks/Wallet/hooks/useChangeNetworks.ts
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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')
Expand Down
15 changes: 6 additions & 9 deletions src/locales/messages.pot
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,6 @@ msgstr ""
msgid "Contract address: {0}"
msgstr ""

msgid "No surplus"
msgstr ""

msgid "Trust"
msgstr ""

Expand Down Expand Up @@ -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 ""

Expand Down Expand Up @@ -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 ""

Expand Down Expand Up @@ -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</0> of unclaimed NFT credits"
msgstr ""

Expand Down Expand Up @@ -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 ""

Expand Down
6 changes: 5 additions & 1 deletion src/models/networkName.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
}
Original file line number Diff line number Diff line change
@@ -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)
Expand Down Expand Up @@ -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
Expand Down
31 changes: 31 additions & 0 deletions src/packages/v4/components/ChainLogo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import Image from "next/image";
import { JBChainId } from "juice-sdk-react";
import { NETWORKS } from "constants/networks";

const chainIdToLogo: Record<number, string> = {
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 (
<Image
src={chainIdToLogo[chainId]}
alt={`${NETWORKS[chainId].label} Logo`}
width={width ?? 20}
height={height ?? 20}
/>
);
};
Original file line number Diff line number Diff line change
@@ -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 (
<JuiceListbox
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { DEFAULT_PROJECT_CHAIN_ID, SupportedChainId } from 'constants/networks'
import { useEffect, useMemo } from 'react'
import {
DEFAULT_MUST_START_AT_OR_AFTER,
Expand All @@ -7,6 +6,7 @@ import {

import { Form } from 'antd'
import { useForm } from 'antd/lib/form/Form'
import { DEFAULT_PROJECT_CHAIN_ID } from 'constants/networks'
import { useWallet } from 'hooks/Wallet'
import { ProjectTagName } from 'models/project-tags'
import { V2V3CurrencyOption } from 'packages/v2v3/models/currencyOption'
Expand All @@ -18,7 +18,7 @@ import { AmountInputValue } from '../ProjectDetailsPage'

type ProjectDetailsFormProps = Partial<{
projectName: string
projectChainId: SupportedChainId
projectChainId: number // v4TODO: should be JBChainId
projectTagline: string
projectDescription: string
logo: string
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
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 { DEFAULT_PROJECT_CHAIN_ID } from 'constants/networks'
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_PAYOUT_LIMIT } from 'packages/v4/utils/math'
import { DEFAULT_PROJECT_CHAIN_ID } from 'constants/networks'
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 { MAX_PAYOUT_LIMIT } from 'packages/v4/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 { projectTokenSettingsToReduxFormat } from '../utils/projectTokenSettingsToReduxFormat'
import { useDispatch } from 'react-redux'
import { useRouter } from 'next/router'
import { zeroAddress } from 'viem'
import { DefaultSettings as DefaultTokenSettings } from '../components/pages/ProjectToken/hooks/useProjectTokenForm'
import { projectTokenSettingsToReduxFormat } from '../utils/projectTokenSettingsToReduxFormat'

const ReduxDefaultTokenSettings =
projectTokenSettingsToReduxFormat(DefaultTokenSettings)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
import { Trans, t } from '@lingui/macro'
import {
PayProjectModalFormValues,
usePayProjectModal,
} from './hooks/usePayProjectModal/usePayProjectModal'
import { Trans, t } from '@lingui/macro'

import { ChainSelectSection } from './components/ChainSelectSection'
import EtherscanLink from 'components/EtherscanLink'
import ExternalLink from 'components/ExternalLink'
import { JuiceModal } from 'components/modals/JuiceModal'
import { Formik } from 'formik'
import { useWallet } from 'hooks/Wallet'
import { JBChainId } from 'juice-sdk-react'
import Image from 'next/legacy/image'
import { JuiceModal } from 'components/modals/JuiceModal'
import { useV4UserNftCredits } from 'packages/v4/contexts/V4UserNftCreditsProvider'
import { twMerge } from 'tailwind-merge'
import { helpPagePath } from 'utils/helpPagePath'
import { ChainSelectSection } from './components/ChainSelectSection'
import { MessageSection } from './components/MessageSection'
import { ReceiveSection } from './components/ReceiveSection'
import { helpPagePath } from 'utils/helpPagePath'
import { twMerge } from 'tailwind-merge'
import { usePayAmounts } from './hooks/usePayAmounts'
import { useV4UserNftCredits } from 'packages/v4/contexts/V4UserNftCreditsProvider'
import { useWallet } from 'hooks/Wallet'

export const PayProjectModal: React.FC = () => {
const {
Expand Down Expand Up @@ -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) {
Expand Down
Loading
Loading