From c0f11d16cebdc203ff28310c8313d9ccb8038614 Mon Sep 17 00:00:00 2001 From: horsefacts Date: Sun, 15 Dec 2024 19:56:19 -0500 Subject: [PATCH] use @farcaster/frame-wagmi-conector --- package.json | 1 + src/components/providers/WagmiProvider.tsx | 4 +- src/lib/connector.ts | 134 --------------------- yarn.lock | 5 + 4 files changed, 8 insertions(+), 136 deletions(-) delete mode 100644 src/lib/connector.ts diff --git a/package.json b/package.json index e0cea1c..29ea631 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "@farcaster/frame-node": "^0.0.3", "@farcaster/frame-sdk": "^0.0.16", + "@farcaster/frame-wagmi-connector": "^0.0.1", "@tanstack/react-query": "^5.61.0", "@upstash/redis": "^1.34.3", "next": "15.0.3", diff --git a/src/components/providers/WagmiProvider.tsx b/src/components/providers/WagmiProvider.tsx index b338455..45dffe5 100644 --- a/src/components/providers/WagmiProvider.tsx +++ b/src/components/providers/WagmiProvider.tsx @@ -1,7 +1,7 @@ import { createConfig, http, WagmiProvider } from "wagmi"; import { base, optimism } from "wagmi/chains"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { frameConnector } from "~/lib/connector"; +import { farcasterFrame } from "@farcaster/frame-wagmi-connector"; export const config = createConfig({ chains: [base, optimism], @@ -9,7 +9,7 @@ export const config = createConfig({ [base.id]: http(), [optimism.id]: http(), }, - connectors: [frameConnector()], + connectors: [farcasterFrame()], }); const queryClient = new QueryClient(); diff --git a/src/lib/connector.ts b/src/lib/connector.ts deleted file mode 100644 index 9ea7cd7..0000000 --- a/src/lib/connector.ts +++ /dev/null @@ -1,134 +0,0 @@ -import sdk from "@farcaster/frame-sdk"; -import { SwitchChainError, fromHex, getAddress, numberToHex } from "viem"; -import { ChainNotConfiguredError, Connector, createConnector } from "wagmi"; - -frameConnector.type = "frameConnector" as const; - -let accountsChanged: Connector['onAccountsChanged'] | undefined -let chainChanged: Connector['onChainChanged'] | undefined -let disconnect: Connector['onDisconnect'] | undefined - -export function frameConnector() { - let connected = true; - - return createConnector((config) => ({ - id: "farcaster", - name: "Farcaster Wallet", - type: frameConnector.type, - - async setup() { - this.connect({ chainId: config.chains[0].id }); - }, - async connect({ chainId } = {}) { - const provider = await this.getProvider(); - const accounts = await provider.request({ - method: "eth_requestAccounts", - }); - - if (!accountsChanged) { - accountsChanged = this.onAccountsChanged.bind(this) - // @ts-expect-error - provider type is stricter - provider.on('accountsChanged', accountsChanged) - } - if (!chainChanged) { - chainChanged = this.onChainChanged.bind(this) - provider.on('chainChanged', chainChanged) - } - if (!disconnect) { - disconnect = this.onDisconnect.bind(this) - provider.on('disconnect', disconnect) - } - - let currentChainId = await this.getChainId(); - if (chainId && currentChainId !== chainId) { - const chain = await this.switchChain!({ chainId }); - currentChainId = chain.id; - } - - connected = true; - - return { - accounts: accounts.map((x) => getAddress(x)), - chainId: currentChainId, - }; - }, - async disconnect() { - const provider = await this.getProvider() - - if (accountsChanged) { - // @ts-expect-error - provider type is stricter - provider.removeListener('accountsChanged', accountsChanged) - accountsChanged = undefined - } - - if (chainChanged) { - provider.removeListener('chainChanged', chainChanged) - chainChanged = undefined - } - - if (disconnect) { - provider.removeListener('disconnect', disconnect) - disconnect = undefined - } - - connected = false; - }, - async getAccounts() { - if (!connected) throw new Error("Not connected"); - const provider = await this.getProvider(); - const accounts = await provider.request({ - method: "eth_requestAccounts", - }); - return accounts.map((x) => getAddress(x)); - }, - async getChainId() { - const provider = await this.getProvider(); - const hexChainId = await provider.request({ method: "eth_chainId" }); - return fromHex(hexChainId, "number"); - }, - async isAuthorized() { - if (!connected) { - return false; - } - - const accounts = await this.getAccounts(); - return !!accounts.length; - }, - async switchChain({ chainId }) { - const provider = await this.getProvider(); - const chain = config.chains.find((x) => x.id === chainId); - if (!chain) throw new SwitchChainError(new ChainNotConfiguredError()); - - await provider.request({ - method: "wallet_switchEthereumChain", - params: [{ chainId: numberToHex(chainId) }], - }); - - // providers should start emitting these events - remove when hosts have upgraded - // - // explicitly emit this event as a workaround for ethereum provider not - // emitting events, can remove once events are flowing - config.emitter.emit("change", { chainId }); - - return chain; - }, - onAccountsChanged(accounts) { - if (accounts.length === 0) this.onDisconnect(); - else - config.emitter.emit("change", { - accounts: accounts.map((x) => getAddress(x)), - }); - }, - onChainChanged(chain) { - const chainId = Number(chain); - config.emitter.emit("change", { chainId }); - }, - async onDisconnect() { - config.emitter.emit("disconnect"); - connected = false; - }, - async getProvider() { - return sdk.wallet.ethProvider; - }, - })); -} diff --git a/yarn.lock b/yarn.lock index 9b84889..5a13287 100644 --- a/yarn.lock +++ b/yarn.lock @@ -131,6 +131,11 @@ eventemitter3 "^5.0.1" ox "^0.4.0" +"@farcaster/frame-wagmi-connector@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@farcaster/frame-wagmi-connector/-/frame-wagmi-connector-0.0.1.tgz#415324d2d8c233aa56befe4e2c5ec71714f5aa5b" + integrity sha512-baFIrhHKrd0PEm/j6BY3vSXazkd95nzuY5e6+5mmZoGRU3LEc4PZHZ2b2tAnxW7tS5A6jEK8NsS/QkrYi4/BLQ== + "@humanwhocodes/config-array@^0.13.0": version "0.13.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"