diff --git a/.changeset/modern-dolls-tickle.md b/.changeset/modern-dolls-tickle.md
new file mode 100644
index 000000000..5de8d29a2
--- /dev/null
+++ b/.changeset/modern-dolls-tickle.md
@@ -0,0 +1,10 @@
+---
+"create-eth": patch
+---
+
+- Feat/multi chain (#615)
+- Add links to the docs for components and hooks (#620)
+- Fix useScaffoldEventHistory hook new events order (#622)
+- Add requiredFilters param to useScaffoldEventHistory hook (#621)
+- update wagmi, viem and rainbowkit versions (#626)
+- Refactor: types/interfaces (#627)
diff --git a/README.md b/README.md
index 4bf6ecf19..eab5a1184 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,8 @@
⚙️ Built using NextJS, RainbowKit, Hardhat, Foundry, Wagmi, and Typescript.
- ✅ **Contract Hot Reload**: Your frontend auto-adapts to your smart contract as you edit it.
+- 🪝 **[Custom hooks](https://docs.scaffoldeth.io/hooks/)**: Collection of React hooks wrapper around [wagmi](https://wagmi.sh/) to simplify interactions with smart contracts with typescript autocompletion.
+- 🧱 [**Components**](https://docs.scaffoldeth.io/components/): Collection of common web3 components to quickly build your frontend.
- 🔥 **Burner Wallet & Local Faucet**: Quickly test your application with a burner wallet and local faucet.
- 🔐 **Integration with Wallet Providers**: Connect to different wallet providers and interact with the Ethereum network.
diff --git a/templates/base/packages/nextjs/components/Footer.tsx b/templates/base/packages/nextjs/components/Footer.tsx
index b0bd90484..92981c8b9 100644
--- a/templates/base/packages/nextjs/components/Footer.tsx
+++ b/templates/base/packages/nextjs/components/Footer.tsx
@@ -6,15 +6,16 @@ import { HeartIcon } from "@heroicons/react/24/outline";
import { SwitchTheme } from "~~/components/SwitchTheme";
import { BuidlGuidlLogo } from "~~/components/assets/BuidlGuidlLogo";
import { Faucet } from "~~/components/scaffold-eth";
+import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork";
import { useGlobalState } from "~~/services/store/store";
-import { getTargetNetwork } from "~~/utils/scaffold-eth";
/**
* Site footer
*/
export const Footer = () => {
const nativeCurrencyPrice = useGlobalState(state => state.nativeCurrencyPrice);
- const isLocalNetwork = getTargetNetwork().id === hardhat.id;
+ const { targetNetwork } = useTargetNetwork();
+ const isLocalNetwork = targetNetwork.id === hardhat.id;
return (
diff --git a/templates/base/packages/nextjs/components/Header.tsx b/templates/base/packages/nextjs/components/Header.tsx
index 13fa47a04..4a5d86b15 100644
--- a/templates/base/packages/nextjs/components/Header.tsx
+++ b/templates/base/packages/nextjs/components/Header.tsx
@@ -6,11 +6,11 @@ import { Bars3Icon, BugAntIcon } from "@heroicons/react/24/outline";
import { FaucetButton, RainbowKitCustomConnectButton } from "~~/components/scaffold-eth";
import { useOutsideClick } from "~~/hooks/scaffold-eth";
-interface HeaderMenuLink {
+type HeaderMenuLink = {
label: string;
href: string;
icon?: React.ReactNode;
-}
+};
export const menuLinks: HeaderMenuLink[] = [
{
diff --git a/templates/base/packages/nextjs/components/blockexplorer/PaginationButton.tsx b/templates/base/packages/nextjs/components/blockexplorer/PaginationButton.tsx
index 97e4cb986..77aefbc14 100644
--- a/templates/base/packages/nextjs/components/blockexplorer/PaginationButton.tsx
+++ b/templates/base/packages/nextjs/components/blockexplorer/PaginationButton.tsx
@@ -1,10 +1,10 @@
import { ArrowLeftIcon, ArrowRightIcon } from "@heroicons/react/24/outline";
-interface PaginationButtonProps {
+type PaginationButtonProps = {
currentPage: number;
totalItems: number;
setCurrentPage: (page: number) => void;
-}
+};
const ITEMS_PER_PAGE = 20;
diff --git a/templates/base/packages/nextjs/components/blockexplorer/TransactionsTable.tsx b/templates/base/packages/nextjs/components/blockexplorer/TransactionsTable.tsx
index 5f9d4611c..e462dc946 100644
--- a/templates/base/packages/nextjs/components/blockexplorer/TransactionsTable.tsx
+++ b/templates/base/packages/nextjs/components/blockexplorer/TransactionsTable.tsx
@@ -1,11 +1,12 @@
import { formatEther } from "viem";
import { TransactionHash } from "~~/components/blockexplorer/TransactionHash";
import { Address } from "~~/components/scaffold-eth";
-import { TransactionWithFunction, getTargetNetwork } from "~~/utils/scaffold-eth";
+import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork";
+import { TransactionWithFunction } from "~~/utils/scaffold-eth";
import { TransactionsTableProps } from "~~/utils/scaffold-eth/";
export const TransactionsTable = ({ blocks, transactionReceipts }: TransactionsTableProps) => {
- const targetNetwork = getTargetNetwork();
+ const { targetNetwork } = useTargetNetwork();
return (
diff --git a/templates/base/packages/nextjs/components/scaffold-eth/Address.tsx b/templates/base/packages/nextjs/components/scaffold-eth/Address.tsx
index 67eb512a1..057d706bc 100644
--- a/templates/base/packages/nextjs/components/scaffold-eth/Address.tsx
+++ b/templates/base/packages/nextjs/components/scaffold-eth/Address.tsx
@@ -6,9 +6,10 @@ import { hardhat } from "viem/chains";
import { useEnsAvatar, useEnsName } from "wagmi";
import { CheckCircleIcon, DocumentDuplicateIcon } from "@heroicons/react/24/outline";
import { BlockieAvatar } from "~~/components/scaffold-eth";
-import { getBlockExplorerAddressLink, getTargetNetwork } from "~~/utils/scaffold-eth";
+import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork";
+import { getBlockExplorerAddressLink } from "~~/utils/scaffold-eth";
-type TAddressProps = {
+type AddressProps = {
address?: string;
disableAddressLink?: boolean;
format?: "short" | "long";
@@ -28,11 +29,13 @@ const blockieSizeMap = {
/**
* Displays an address (or ENS) with a Blockie image and option to copy address.
*/
-export const Address = ({ address, disableAddressLink, format, size = "base" }: TAddressProps) => {
+export const Address = ({ address, disableAddressLink, format, size = "base" }: AddressProps) => {
const [ens, setEns] = useState();
const [ensAvatar, setEnsAvatar] = useState();
const [addressCopied, setAddressCopied] = useState(false);
+ const { targetNetwork } = useTargetNetwork();
+
const { data: fetchedEns } = useEnsName({ address, enabled: isAddress(address ?? ""), chainId: 1 });
const { data: fetchedEnsAvatar } = useEnsAvatar({
name: fetchedEns,
@@ -66,7 +69,7 @@ export const Address = ({ address, disableAddressLink, format, size = "base" }:
return Wrong address ;
}
- const blockExplorerAddressLink = getBlockExplorerAddressLink(getTargetNetwork(), address);
+ const blockExplorerAddressLink = getBlockExplorerAddressLink(targetNetwork, address);
let displayAddress = address?.slice(0, 5) + "..." + address?.slice(-4);
if (ens) {
@@ -86,7 +89,7 @@ export const Address = ({ address, disableAddressLink, format, size = "base" }:
{disableAddressLink ? (
{displayAddress}
- ) : getTargetNetwork().id === hardhat.id ? (
+ ) : targetNetwork.id === hardhat.id ? (
{displayAddress}
diff --git a/templates/base/packages/nextjs/components/scaffold-eth/Balance.tsx b/templates/base/packages/nextjs/components/scaffold-eth/Balance.tsx
index 7de5e843c..66bc172e7 100644
--- a/templates/base/packages/nextjs/components/scaffold-eth/Balance.tsx
+++ b/templates/base/packages/nextjs/components/scaffold-eth/Balance.tsx
@@ -1,7 +1,7 @@
import { useAccountBalance } from "~~/hooks/scaffold-eth";
-import { getTargetNetwork } from "~~/utils/scaffold-eth";
+import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork";
-type TBalanceProps = {
+type BalanceProps = {
address?: string;
className?: string;
};
@@ -9,8 +9,8 @@ type TBalanceProps = {
/**
* Display (ETH & USD) balance of an ETH address.
*/
-export const Balance = ({ address, className = "" }: TBalanceProps) => {
- const configuredNetwork = getTargetNetwork();
+export const Balance = ({ address, className = "" }: BalanceProps) => {
+ const { targetNetwork } = useTargetNetwork();
const { balance, price, isError, isLoading, onToggleBalance, isEthBalance } = useAccountBalance(address);
if (!address || isLoading || balance === null) {
@@ -41,7 +41,7 @@ export const Balance = ({ address, className = "" }: TBalanceProps) => {
{isEthBalance ? (
<>
{balance?.toFixed(4)}
-
{configuredNetwork.nativeCurrency.symbol}
+
{targetNetwork.nativeCurrency.symbol}
>
) : (
<>
diff --git a/templates/base/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx b/templates/base/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx
index bcacf9c08..84869deca 100644
--- a/templates/base/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx
+++ b/templates/base/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx
@@ -5,7 +5,7 @@ import { ContractWriteMethods } from "./ContractWriteMethods";
import { Spinner } from "~~/components/assets/Spinner";
import { Address, Balance } from "~~/components/scaffold-eth";
import { useDeployedContractInfo, useNetworkColor } from "~~/hooks/scaffold-eth";
-import { getTargetNetwork } from "~~/utils/scaffold-eth";
+import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork";
import { ContractName } from "~~/utils/scaffold-eth/contract";
type ContractUIProps = {
@@ -18,8 +18,7 @@ type ContractUIProps = {
**/
export const ContractUI = ({ contractName, className = "" }: ContractUIProps) => {
const [refreshDisplayVariables, triggerRefreshDisplayVariables] = useReducer(value => !value, false);
- const configuredNetwork = getTargetNetwork();
-
+ const { targetNetwork } = useTargetNetwork();
const { data: deployedContractData, isLoading: deployedContractLoading } = useDeployedContractInfo(contractName);
const networkColor = useNetworkColor();
@@ -34,7 +33,7 @@ export const ContractUI = ({ contractName, className = "" }: ContractUIProps) =>
if (!deployedContractData) {
return (
- {`No contract found by the name of "${contractName}" on chain "${configuredNetwork.name}"!`}
+ {`No contract found by the name of "${contractName}" on chain "${targetNetwork.name}"!`}
);
}
@@ -54,10 +53,10 @@ export const ContractUI = ({ contractName, className = "" }: ContractUIProps) =>
- {configuredNetwork && (
+ {targetNetwork && (