From c0d9340373fabb47319e7229db9b7327ea95bf4e Mon Sep 17 00:00:00 2001 From: bz <88026162+bz-hashtag-0780@users.noreply.github.com> Date: Mon, 13 Oct 2025 19:35:46 +0200 Subject: [PATCH] Add Flow EVM Mainnet support --- components/hooks/useNetworkNativeToken.ts | 3 +++ components/ui/AirdropModal.tsx | 3 +++ components/ui/DeployModal.tsx | 4 ++++ components/ui/ExternalContractLink.tsx | 3 +++ components/ui/Navbar.tsx | 2 ++ lib/chains/flowevm.ts | 25 +++++++++++++++++++++++ lib/contracts.ts | 3 +++ lib/wagmi.ts | 3 +++ pages/verify/erc20.tsx | 2 ++ 9 files changed, 48 insertions(+) create mode 100644 lib/chains/flowevm.ts diff --git a/components/hooks/useNetworkNativeToken.ts b/components/hooks/useNetworkNativeToken.ts index a829890..aa07bcd 100644 --- a/components/hooks/useNetworkNativeToken.ts +++ b/components/hooks/useNetworkNativeToken.ts @@ -40,6 +40,9 @@ function useNetworkNativeToken() { case "Abstract": return "ETH"; + case "Flow EVM Mainnet": + return "FLOW"; + default: return "ETH"; } diff --git a/components/ui/AirdropModal.tsx b/components/ui/AirdropModal.tsx index e4d8a8c..1d4acdf 100644 --- a/components/ui/AirdropModal.tsx +++ b/components/ui/AirdropModal.tsx @@ -23,6 +23,7 @@ import { sanko, apeChain, abstract, + flowMainnet, } from "viem/chains"; interface Recipient { @@ -85,6 +86,8 @@ const deriveExternalLink = (txHash: string, chainId?: number) => { return `https://apescan.io/tx/${txHash}`; case abstract.id: return `https://abscan.org/tx/${txHash}`; + case flowMainnet.id: + return `https://evm.flowscan.io/tx/${txHash}`; default: return `https://etherscan.io/tx/${txHash}`; } diff --git a/components/ui/DeployModal.tsx b/components/ui/DeployModal.tsx index 5ac8ead..726562d 100644 --- a/components/ui/DeployModal.tsx +++ b/components/ui/DeployModal.tsx @@ -15,6 +15,7 @@ import { sepolia, bsc, zora, + flowMainnet } from "viem/chains"; import Bytecode20 from "../../contracts/out/Bytecode20.sol/Bytecode20.json"; import { useRouter } from "next/router"; @@ -23,6 +24,7 @@ import { degen } from "@/lib/chains/degen"; import { sanko } from "@/lib/chains/sanko"; import { apechain } from "@/lib/chains/apechain"; import { abstract } from "@/lib/chains/abstract"; +import { flowevm } from "@/lib/chains/flowevm"; const deriveExternalLink = (txHash, chainId) => { switch (chainId) { @@ -52,6 +54,8 @@ const deriveExternalLink = (txHash, chainId) => { return `https://apescan.io/tx/${txHash}`; case abstract.id: return `https://abscan.org/tx/${txHash}`; + case flowMainnet.id: + return `https://evm.flowscan.io/tx/${txHash}`; default: return `https://etherscan.io/tx/${txHash}`; } diff --git a/components/ui/ExternalContractLink.tsx b/components/ui/ExternalContractLink.tsx index 270ece4..5695d7b 100644 --- a/components/ui/ExternalContractLink.tsx +++ b/components/ui/ExternalContractLink.tsx @@ -16,6 +16,7 @@ import { apeChain, abstract, mainnet, + flowMainnet } from "viem/chains"; const deriveExternalLink = (tokenAddress, chainId) => { @@ -46,6 +47,8 @@ const deriveExternalLink = (tokenAddress, chainId) => { return `${apeChain.blockExplorers.default.url}/address/${tokenAddress}`; case abstract.id: return `${abstract.blockExplorers.default.url}/address/${tokenAddress}`; + case flowMainnet.id: + return `${flowMainnet.blockExplorers.default.url}/address/${tokenAddress}`; default: return `${mainnet.blockExplorers.default.url}/address/${tokenAddress}`; } diff --git a/components/ui/Navbar.tsx b/components/ui/Navbar.tsx index c51912b..14ff33a 100644 --- a/components/ui/Navbar.tsx +++ b/components/ui/Navbar.tsx @@ -17,6 +17,7 @@ import { sanko, apeChain, abstract, + flowMainnet } from "viem/chains"; import { airdropContractAddress } from "@/lib/contracts"; @@ -43,6 +44,7 @@ export default function Navbar() { SANKO: `${sanko.blockExplorers.default.url}/address/${airdropContractAddress?.[chainId]}`, apeChain: `${apeChain.blockExplorers.default.url}/address/${airdropContractAddress?.[chainId]}`, ABSTRACT: `${abstract.blockExplorers.default.url}/address/${airdropContractAddress?.[chainId]}`, + FLOWEVM: `${flowMainnet.blockExplorers.default.url}/address/${airdropContractAddress?.[chainId]}`, }; return explorers[chainName]; diff --git a/lib/chains/flowevm.ts b/lib/chains/flowevm.ts new file mode 100644 index 0000000..eb1f4f3 --- /dev/null +++ b/lib/chains/flowevm.ts @@ -0,0 +1,25 @@ +import { defineChain } from "viem"; + +export const flowevm = defineChain({ + id: 747, + name: 'Flow EVM Mainnet', + nativeCurrency: { + decimals: 18, + name: 'Flow', + symbol: 'FLOW', + }, + rpcUrls: { + default: { + http: ['https://mainnet.evm.nodes.onflow.org'], + }, + }, + blockExplorers: { + default: { + name: 'Mainnet Explorer', + url: 'https://evm.flowscan.io', + }, + }, + iconUrl: "https://raw.githubusercontent.com/onflow/assets/refs/heads/main/tokens/registry/testnet%3A0xd3bf53dac106a0290b0483ecbc89d40fcc961f3e/logo.svg", + blockTime: 800, +}); + diff --git a/lib/contracts.ts b/lib/contracts.ts index 0ccd881..6bb9138 100644 --- a/lib/contracts.ts +++ b/lib/contracts.ts @@ -13,6 +13,7 @@ import { sanko, apeChain, abstract, + flowMainnet } from "viem/chains"; export const airdropContractAddress = { @@ -30,6 +31,7 @@ export const airdropContractAddress = { [sanko.id]: "0x0eBa170fDC5edC7f528AdbEebC6a1bFc55343181", [apeChain.id]: "0x54b5cd30582ddc305d814c95138a5bce04419249", [abstract.id]: "0xe231Aa7183862CEe136D8414E5638764c4297E79", + [flowMainnet.id]: "0xD9D7aA276E216922016386Bdf0AE9F9B4b167F3B", }; export const airdrop1155ContractAddress = { @@ -43,6 +45,7 @@ export const airdrop1155ContractAddress = { [bsc.id]: "0x53d097F8f78Ada73085fAF3A4c36B9Ec58E7E172", [sanko.id]: "0xeCC9a57543bFDe6BBc01420680Fc4a1BC51B6D1A", [abstract.id]: "0xa5a2e5A4aa8Fd0CB021c00fc62283F337c175d07", + [flowMainnet.id]: "0x853EcD46B0701FF8f7d3Aabd24C3e8fb60F520c8", [blast.id]: "", // not deployed yet! [degen.id]: "", // not deployed yet! [zora.id]: "", // not deployed yet! diff --git a/lib/wagmi.ts b/lib/wagmi.ts index 60e5c96..33db999 100644 --- a/lib/wagmi.ts +++ b/lib/wagmi.ts @@ -19,6 +19,7 @@ import { apeChain, abstract, sepolia, + flowMainnet } from "viem/chains"; import { eip712WalletActions } from "viem/zksync"; @@ -35,6 +36,7 @@ export const chains = [ degen, sanko, apeChain, + flowMainnet, ...(process.env.NEXT_PUBLIC_ENABLE_TESTNETS === "true" ? [sepolia] : []), ]; @@ -77,6 +79,7 @@ export const config = createConfig({ [degen.id]: http(), [sanko.id]: http(), [apeChain.id]: http(), + [flowMainnet.id]: http(), [sepolia.id]: http(), }, }); diff --git a/pages/verify/erc20.tsx b/pages/verify/erc20.tsx index edcdba2..8fe234d 100644 --- a/pages/verify/erc20.tsx +++ b/pages/verify/erc20.tsx @@ -22,6 +22,7 @@ import { sanko, apeChain, abstract, + flowMainnet } from "viem/chains"; const chains = [ @@ -39,6 +40,7 @@ const chains = [ sanko, apeChain, abstract, + flowMainnet ]; const publicClients = chains.map((chain) =>