diff --git a/package.json b/package.json index 6e5a52a..a12d060 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "lint": "next lint" }, "dependencies": { - "@farcaster/frame-sdk": "^0.0.6", + "@farcaster/frame-sdk": "^0.0.8", "@tanstack/react-query": "^5.61.0", "next": "15.0.3", "react": "19.0.0-rc-66855b96-20241106", diff --git a/src/lib/connector.ts b/src/lib/connector.ts index 1142c21..9ea7cd7 100644 --- a/src/lib/connector.ts +++ b/src/lib/connector.ts @@ -1,9 +1,13 @@ import sdk from "@farcaster/frame-sdk"; import { SwitchChainError, fromHex, getAddress, numberToHex } from "viem"; -import { ChainNotConfiguredError, createConnector } from "wagmi"; +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; @@ -21,6 +25,20 @@ export function frameConnector() { 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 }); @@ -35,6 +53,24 @@ export function frameConnector() { }; }, 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() { @@ -68,6 +104,8 @@ export function frameConnector() { 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 }); diff --git a/yarn.lock b/yarn.lock index d696710..8e24490 100644 --- a/yarn.lock +++ b/yarn.lock @@ -105,23 +105,23 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@farcaster/frame-core@^0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@farcaster/frame-core/-/frame-core-0.0.5.tgz#e3d8afc6d6acf3596221b0207e39da8e5a111aac" - integrity sha512-xQFKzQjSS7gF6EjozCBBeFBp8Ndq4QWKXh0HUQ66gjGYUfg6GmFY0x7HjlZ7jR/tngmW7W7CXKOCuz6u7hMCqQ== +"@farcaster/frame-core@^0.0.7": + version "0.0.7" + resolved "https://registry.yarnpkg.com/@farcaster/frame-core/-/frame-core-0.0.7.tgz#e113291525898df21c183935d145d95123e0f4e1" + integrity sha512-hN5YVoFKVy2erc8HeYmKfsJM+7yCvNU9HjTWlf9BLf9bQ1aGAIYSk5ozjsk62ob3qeQrgAyaXBPKTGarOt1Qew== dependencies: - ox "^0.1.6" + ox "^0.4.0" zod "^3.23.8" -"@farcaster/frame-sdk@^0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/@farcaster/frame-sdk/-/frame-sdk-0.0.6.tgz#559788838cb5e3d17482521baa05094b494926a1" - integrity sha512-SqEnrbzVLDIKkAEv+K++0X/R8FxqLR7V4QGx6njHnD9pFZrxaP0VHfRxBBEDd3n4CVIKz+3A0rugI/CUF9p0zQ== +"@farcaster/frame-sdk@^0.0.8": + version "0.0.8" + resolved "https://registry.yarnpkg.com/@farcaster/frame-sdk/-/frame-sdk-0.0.8.tgz#854f7ea55b30f5cff54fc6dc9992caf2c4bc052e" + integrity sha512-KSEGbXAbmv03pkNARHiChSHr/NSaZUIr2P5kB6+x6Qlr38Oufyj1cULfXOQHDAuQTXKQGK3E2T+wupvx1FvRnA== dependencies: - "@farcaster/frame-core" "^0.0.5" + "@farcaster/frame-core" "^0.0.7" comlink "^4.4.2" eventemitter3 "^5.0.1" - ox "^0.2.2" + ox "^0.4.0" "@humanwhocodes/config-array@^0.13.0": version "0.13.0" @@ -3846,23 +3846,10 @@ ox@0.1.2: abitype "^1.0.6" eventemitter3 "5.0.1" -ox@^0.1.6: - version "0.1.8" - resolved "https://registry.yarnpkg.com/ox/-/ox-0.1.8.tgz#0ba58eb6f2471c607959c40fa39b2fa5c4f4f7e5" - integrity sha512-GJl6uKXxhPq/XgyvAnIokGuGU/pt9CU8reRJjzi4a02HOpLc2CEXXD4bRCITFFAzdRqHj3DQ6GDS7PlCytPM/A== - dependencies: - "@adraffy/ens-normalize" "^1.10.1" - "@noble/curves" "^1.6.0" - "@noble/hashes" "^1.5.0" - "@scure/bip32" "^1.5.0" - "@scure/bip39" "^1.4.0" - abitype "^1.0.6" - eventemitter3 "5.0.1" - -ox@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ox/-/ox-0.2.2.tgz#b177912d2fd9853e52c2db8570ac29c09330cec1" - integrity sha512-QWCyFfVk5hFOhg13SGqRKih5B7EBucrf+Z1dfmN9jJQ8MZdrRx9mbD78JQL5ogSzDT7fcHgyMCaXd/3AWn6xHQ== +ox@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ox/-/ox-0.4.0.tgz#6c73b27a9f45912888917304d7a81c894856a980" + integrity sha512-F+Q8R/7SZ8AvBcejIV6QUcACLjRuFtSShCkwTuCFWLAN5DoS8dSwiFsDBltvQplEXXNGmAEZCV4HDe7orEDSxA== dependencies: "@adraffy/ens-normalize" "^1.10.1" "@noble/curves" "^1.6.0" @@ -4574,7 +4561,16 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4669,8 +4665,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==