diff --git a/package.json b/package.json index da49a69a08..2c1c463c78 100644 --- a/package.json +++ b/package.json @@ -106,8 +106,8 @@ "graphql": "^16.8.1", "he": "^1.2.0", "jsonwebtoken": "^9.0.0", - "juice-sdk-core": "^12.4.0-alpha", - "juice-sdk-react": "^12.4.1-alpha", + "juice-sdk-core": "^12.5.1-alpha", + "juice-sdk-react": "^12.5.0-alpha", "juicebox-metadata-helper": "0.1.7", "less": "4.1.2", "lodash": "^4.17.21", diff --git a/src/hooks/useLoadContractFromAddress.ts b/src/hooks/useLoadContractFromAddress.ts index 496519d6f6..5cb482434f 100644 --- a/src/hooks/useLoadContractFromAddress.ts +++ b/src/hooks/useLoadContractFromAddress.ts @@ -3,7 +3,6 @@ import { Contract, ContractInterface } from 'ethers' import { isAddress } from 'ethers/lib/utils' import { useEffect, useState } from 'react' import { isZeroAddress } from 'utils/address' -import { useWallet } from './Wallet' const isInputAddressValid = ( address: string | undefined, @@ -23,15 +22,13 @@ export const useLoadContractFromAddress = ({ }) => { const [contract, setContract] = useState() - const { signer } = useWallet() - useEffect(() => { if (!abi || !isInputAddressValid(address)) { return setContract(undefined) } - setContract(new Contract(address, abi, signer ?? readProvider)) - }, [address, abi, signer]) + setContract(new Contract(address, abi, readProvider)) + }, [address, abi]) return contract } diff --git a/src/hooks/useTransactor.ts b/src/hooks/useTransactor.ts index 65a1ac4860..2636a1311f 100644 --- a/src/hooks/useTransactor.ts +++ b/src/hooks/useTransactor.ts @@ -83,12 +83,13 @@ export type TransactorInstance = ( export function useTransactor(): Transactor | undefined { const { addTransaction } = useContext(TxHistoryContext) - const { chain, signer, userAddress } = useWallet() + const { chain, userAddress } = useWallet() const { chainUnsupported, isConnected, changeNetworks, connect } = useWallet() + const { signer } = useWallet() return useCallback( async ( - contract: Contract, + _contract: Contract, functionName: string, args: unknown[], options?: TransactionOptions, @@ -111,6 +112,15 @@ export function useTransactor(): Transactor | undefined { return false } + /** + * Create a new contract instance with the signer. + */ + const contract = new Contract( + _contract.address, + _contract.interface, + signer, + ) + logTx({ functionName, contract, args, options }) if ( diff --git a/src/packages/v2v3/contexts/Contracts/useV2V3ContractLoader.ts b/src/packages/v2v3/contexts/Contracts/useV2V3ContractLoader.ts index 7cdbd8d356..8714642c37 100644 --- a/src/packages/v2v3/contexts/Contracts/useV2V3ContractLoader.ts +++ b/src/packages/v2v3/contexts/Contracts/useV2V3ContractLoader.ts @@ -20,12 +20,9 @@ export function useV2V3ContractLoader({ cv }: { cv: CV2V3 | undefined }) { try { const network = readNetwork.name - // Contracts can be used read-only without a signer, but require a signer to create transactions. - const signerOrProvider = signer ?? readProvider - const contractLoaders = await Promise.all( Object.values(V2V3ContractName).map(contractName => - loadV2V3Contract(contractName, network, signerOrProvider, cv), + loadV2V3Contract(contractName, network, readProvider, cv), ), ) diff --git a/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/hooks/useV4TreasuryStats.tsx b/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/hooks/useV4TreasuryStats.tsx index 03856915eb..ddb66d2d60 100644 --- a/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/hooks/useV4TreasuryStats.tsx +++ b/src/packages/v4/views/V4ProjectDashboard/V4ProjectTabs/V4CyclesPayoutsPanel/hooks/useV4TreasuryStats.tsx @@ -1,14 +1,13 @@ +import { Tooltip } from 'antd' +import { NETWORKS } from 'constants/networks' import { JBChainId, NativeTokenValue, useJBRulesetMetadata, - useSuckersNativeTokenSurplus + useSuckersNativeTokenBalance, + useSuckersNativeTokenSurplus, } from 'juice-sdk-react' - -import { Tooltip } from 'antd' -import { NETWORKS } from 'constants/networks' import { ChainLogo } from 'packages/v4/components/ChainLogo' -import { useV4BalanceOfNativeTerminal } from 'packages/v4/hooks/useV4BalanceOfNativeTerminal' import { useMemo } from 'react' import { useV4DistributableAmount } from './useV4DistributableAmount' @@ -16,21 +15,64 @@ export const useV4TreasuryStats = () => { const { data: rulesetMetadata } = useJBRulesetMetadata() const { distributableAmount } = useV4DistributableAmount() - const { data: _treasuryBalance } = useV4BalanceOfNativeTerminal() + const { data: suckersBalance } = useSuckersNativeTokenBalance() + const totalBalance = + suckersBalance?.reduce((acc, curr) => { + return acc + curr.balance + }, 0n) ?? 0n - const surplusQuery = useSuckersNativeTokenSurplus(); + const surplusQuery = useSuckersNativeTokenSurplus() // NOTE: if loading state or conversion to USD necessary // const { data: ethPrice, isLoading: isEthLoading } = useEtherPrice(); // const loading = isEthLoading || surplusQuery.isLoading; - const ethSurplusByChain = surplusQuery?.data + const ethSurplusByChain = surplusQuery?.data const totalEthSurplus = ethSurplusByChain?.reduce((acc, curr) => { - return acc + curr.surplus; - }, 0n) ?? 0n; + return acc + curr.surplus + }, 0n) ?? 0n - const treasuryBalance = + const treasuryBalance = 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 ? ( +
+ {suckersBalance?.map((balance, index) => ( +
+
+ + {NETWORKS[balance.chainId].label} +
+ {/* (NOTE: Following comment copied from Revnet: + "TODO maybe show USD-converted value here instead?" */} + + + +
+ ))} +
+ ) : undefined + } + > + + + +
+ ) + }, [totalBalance, suckersBalance]) const surplusElement = useMemo(() => { // NOTE: Don't think we need this since other chains payouts limits may be different? @@ -38,31 +80,43 @@ export const useV4TreasuryStats = () => { // return t`No surplus` return ( 0 ? -
- {ethSurplusByChain?.map((surplus, index) => ( -
-
- - {NETWORKS[surplus.chainId].label} -
- {/* (NOTE: Following comment copied from Revnet: + title={ + ethSurplusByChain?.length && ethSurplusByChain.length > 0 ? ( +
+ {ethSurplusByChain?.map((surplus, index) => ( +
+
+ + {NETWORKS[surplus.chainId].label} +
+ {/* (NOTE: Following comment copied from Revnet: "TODO maybe show USD-converted value here instead?" */} - - - -
- ))} - -
- : undefined} + + + +
+ ))} +
+ ) : undefined + } > - + + +
) }, [totalEthSurplus, ethSurplusByChain]) const availableToPayout = + return { treasuryBalance, availableToPayout, diff --git a/yarn.lock b/yarn.lock index b45eff205c..df9a30de31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12178,18 +12178,18 @@ jsx-ast-utils@^3.3.5: object.assign "^4.1.4" object.values "^1.1.6" -juice-sdk-core@^12.4.0-alpha: - version "12.4.0-alpha" - resolved "https://registry.yarnpkg.com/juice-sdk-core/-/juice-sdk-core-12.4.0-alpha.tgz#966283a87a0ba2fcfbf7499912e8fe3213557dbb" - integrity sha512-qL8YEoID45pm+levjtJ5jCThfkmqTvsNYKIpWr+z+Ij+lmWmRambVXvKp6SlYNqD7jp3F4s+uSmLDEZEeYaDpw== +juice-sdk-core@^12.5.1-alpha: + version "12.5.1-alpha" + resolved "https://registry.yarnpkg.com/juice-sdk-core/-/juice-sdk-core-12.5.1-alpha.tgz#66c2fccf059c8c6326943f5220afdb2ddaf1db46" + integrity sha512-K8/F8QlpMcALtWAA4QcHkoOJKeTFg/+kCKguI3H+VjTW5gKr8MHVx2uKJMELzyaDS8ti0SvwQLU32wPYA1rArg== dependencies: bs58 "^5.0.0" fpnum "^1.0.0" -juice-sdk-react@^12.4.1-alpha: - version "12.4.1-alpha" - resolved "https://registry.yarnpkg.com/juice-sdk-react/-/juice-sdk-react-12.4.1-alpha.tgz#e63bafd1e21e0d30bf1e47f9f6a45b6f323747ff" - integrity sha512-9jqxaprt2+DQiz3drSEdidbdLS4C5DTyUHGqLsQEVbPSwH2PjO2WTr8HbVMtMcRdtdZrytDRCSkJdMOPtmg3BQ== +juice-sdk-react@^12.5.0-alpha: + version "12.5.0-alpha" + resolved "https://registry.yarnpkg.com/juice-sdk-react/-/juice-sdk-react-12.5.0-alpha.tgz#0841d0785e9365a8ff72462a75d7d0fc7edc9dee" + integrity sha512-PgpmpxbEjytXu79Uc9e48J2NBeO8UQy7DlJMSKO7njxv5kbN7Gf/YtrCZ5fRNNA9EWEkXeoqz3p0lI7HXZVIdw== juice@^10.0.0: version "10.0.0"