diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index a89300994..1b24a1b53 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -20,6 +20,7 @@ "@uniswap/sdk-core": "^4.0.1", "@uniswap/v2-sdk": "^3.0.1", "blo": "^1.0.1", + "burner-connector": "^0.0.3", "daisyui": "4.5.0", "next": "^14.0.4", "next-themes": "^0.2.1", diff --git a/packages/nextjs/services/web3/wagmi-burner/burnerWalletConfig.ts b/packages/nextjs/services/web3/wagmi-burner/burnerWalletConfig.ts deleted file mode 100644 index b00ff7427..000000000 --- a/packages/nextjs/services/web3/wagmi-burner/burnerWalletConfig.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Chain, Wallet } from "@rainbow-me/rainbowkit"; -import { hardhat } from "viem/chains"; -import scaffoldConfig from "~~/scaffold.config"; -import { - burnerWalletId, - burnerWalletName, - createBurnerConnector, -} from "~~/services/web3/wagmi-burner/createBurnerConnector"; -import { getTargetNetworks } from "~~/utils/scaffold-eth"; - -const { onlyLocalBurnerWallet } = scaffoldConfig; -const targetNetworks = getTargetNetworks(); - -export type BurnerWalletOptions = { - chains: Chain[]; -}; - -const burnerWalletIconBase64 = - "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzUzIiBoZWlnaHQ9IjM1MiIgdmlld0JveD0iMCAwIDM1MyAzNTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHg9IjAuNzE2MzA5IiB5PSIwLjMxNzEzOSIgd2lkdGg9IjM1MS4zOTQiIGhlaWdodD0iMzUxLjM5NCIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzNfMTUxKSIvPgo8Y2lyY2xlIGN4PSIzNC40OTUzIiBjeT0iMzQuNDk1MyIgcj0iMzQuNDk1MyIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjA3LjAxOCAyNTQuMTIpIiBmaWxsPSIjRkY2NjBBIi8+CjxwYXRoIGQ9Ik0xNTQuMzE4IDMxNy45NTVDMTcxLjI3MyAzMTAuODkgMTc2LjU4MiAyOTAuNzE1IDE3Ni4xNTcgMjgzLjQ4N0wyMDcuMDE4IDI4OC44NjRDMjA3LjAxOCAzMDMuMzE0IDIwMC4yMTIgMzA5LjQwMiAxOTcuODI0IDMxMi40MzNDMTkzLjQ3NCAzMTcuOTU1IDE3My4zNTEgMzMwLjAzIDE1NC4zMTggMzE3Ljk1NVoiIGZpbGw9InVybCgjcGFpbnQxX3JhZGlhbF8zXzE1MSkiLz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8zXzE1MSkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIyNy4zNzcgMzAyLjI3NkMyMjYuNDI2IDMwNS44OTcgMjMwLjMxNSAzMDkuNDA1IDIzMy4zOTYgMzA3LjI3OUMyNTQuNTM4IDI5Mi42ODQgMjcwLjQ3OSAyNjkuOTQ1IDI3NC44OSAyNDcuNDg5QzI4Mi4yNCAyMTAuMDcxIDI3Mi4yMzUgMTc1LjcyNyAyMzguMDI4IDE0NS45MjVDMjAwLjg3NCAxMTMuNTU2IDE5MS44NDQgODguNDU2MSAxOTAuMTYyIDUwLjg3MThDMTg5Ljc5NyA0Mi43MjE4IDE4MS42MDQgMzcuMjk0NyAxNzQuODI0IDQxLjgzMTdDMTUyLjY2OCA1Ni42NTc0IDEzMi41MTIgODQuNDk5IDEzOC45MTEgMTIwLjc1OEMxNDEuMDA0IDEzMi42MjEgMTQ2Ljc5NCAxNDEuMDE2IDE1MS45NyAxNDguNTIzQzE1OC40OTEgMTU3Ljk3OCAxNjQuMDM5IDE2Ni4wMjMgMTU5Ljk5NyAxNzcuODFDMTU1LjIwMyAxOTEuNzk0IDEzOS4xMzQgMTk5LjE2MiAxMjguNzQ3IDE5Mi40MjlDMTE0LjE3IDE4Mi45ODEgMTEzLjI1MyAxNjYuNjUxIDExNy45NjkgMTQ5LjQ1NkMxMTguOTAyIDE0Ni4wNTUgMTE1LjQ3MSAxNDMuMjA0IDExMi42OCAxNDUuMzU5QzkxLjM2MDQgMTYxLjgyMSA2OS4xNTMyIDE5OS4yNjcgNzcuNjY0NyAyNDcuNDg5Qzg1Ljk3OTIgMjc2LjIxMiA5Ny45Mjc3IDI5Mi41MzcgMTEwLjk3MSAzMDEuNTQxQzExMy43NjMgMzAzLjQ2OCAxMTcuMTU5IDMwMC42MzEgMTE2LjU5NyAyOTcuMjg2QzExNi4wODEgMjk0LjIxMiAxMTUuODEzIDI5MS4wNTQgMTE1LjgxMyAyODcuODMzQzExNS44MTMgMjU2LjUxMyAxNDEuMjAzIDIzMS4xMjMgMTcyLjUyMyAyMzEuMTIzQzIwMy44NDIgMjMxLjEyMyAyMjkuMjMyIDI1Ni41MTMgMjI5LjIzMiAyODcuODMzQzIyOS4yMzIgMjkyLjgyNCAyMjguNTg3IDI5Ny42NjUgMjI3LjM3NyAzMDIuMjc2WiIgZmlsbD0idXJsKCNwYWludDJfbGluZWFyXzNfMTUxKSIvPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfM18xNTEiIHg9IjcyLjExMTIiIHk9IjM2LjQ5NCIgd2lkdGg9IjIwOC43NDIiIGhlaWdodD0iMjc1LjEyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgo8ZmVPZmZzZXQvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxLjg0NTA2Ii8+CjxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9Im91dCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAxIDAgMCAwIDAgMC40MiAwIDAgMCAwIDAgMCAwIDAgMC43IDAiLz4KPGZlQmxlbmQgbW9kZT0ibXVsdGlwbHkiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd18zXzE1MSIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd18zXzE1MSIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzNfMTUxIiB4MT0iMTc2LjQxMyIgeTE9IjAuMzE3MTM5IiB4Mj0iMTc2LjQxMyIgeTI9IjM1MS43MTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iI0ZGRjI3OSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGRkQzMzYiLz4KPC9saW5lYXJHcmFkaWVudD4KPHJhZGlhbEdyYWRpZW50IGlkPSJwYWludDFfcmFkaWFsXzNfMTUxIiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDIxOC4wNDggMjQ5LjM0Nykgcm90YXRlKDEyNC4wMTgpIHNjYWxlKDg5LjI5NTUgMjY0LjgwOSkiPgo8c3RvcCBvZmZzZXQ9IjAuNjQwODUiIHN0b3AtY29sb3I9IiNGRjY2MEEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZCRTE1Ii8+CjwvcmFkaWFsR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8zXzE1MSIgeDE9IjE3Ni40ODIiIHkxPSI0MC4xODQxIiB4Mj0iMTc2LjQ4MiIgeTI9IjMxNy4yNzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agb2Zmc2V0PSIwLjMzODU0MiIgc3RvcC1jb2xvcj0iI0ZGOEYzRiIvPgo8c3RvcCBvZmZzZXQ9IjAuNjU2MjUiIHN0b3AtY29sb3I9IiNGRjcwMjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkYzRDAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg=="; - -/** - * Wagmi config for burner wallet - */ -export const burnerWalletConfig = (): Wallet => ({ - id: burnerWalletId, - name: burnerWalletName, - iconUrl: burnerWalletIconBase64, - iconBackground: "#ffffff", - hidden: () => { - if (onlyLocalBurnerWallet) { - return targetNetworks.some(({ id }) => id !== hardhat.id); - } - - return false; - }, - createConnector: createBurnerConnector, -}); diff --git a/packages/nextjs/services/web3/wagmi-burner/createBurnerConnector.ts b/packages/nextjs/services/web3/wagmi-burner/createBurnerConnector.ts deleted file mode 100644 index de53737b6..000000000 --- a/packages/nextjs/services/web3/wagmi-burner/createBurnerConnector.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { WalletDetailsParams } from "@rainbow-me/rainbowkit"; -import { createConnector, normalizeChainId } from "@wagmi/core"; -import { - EIP1193RequestFn, - Hex, - RpcRequestError, - SwitchChainError, - Transport, - WalletRpcSchema, - createWalletClient, - custom, - fromHex, - getAddress, - http, -} from "viem"; -import { privateKeyToAccount } from "viem/accounts"; -import { getHttpRpcClient, hexToBigInt, numberToHex } from "viem/utils"; -import { SendTransactionParameters } from "viem/zksync"; -import { BaseError } from "wagmi"; -import { loadBurnerSK } from "~~/hooks/scaffold-eth"; - -export const burnerWalletId = "burnerWallet"; -export const burnerWalletName = "Burner Wallet"; - -export class ConnectorNotConnectedError extends BaseError { - override name = "ConnectorNotConnectedError"; - constructor() { - super("Connector not connected."); - } -} - -export class ChainNotConfiguredError extends BaseError { - override name = "ChainNotConfiguredError"; - constructor() { - super("Chain not configured."); - } -} - -type Provider = ReturnType, EIP1193RequestFn>>; - -export const createBurnerConnector = (walletDetails: WalletDetailsParams) => { - let connected = true; - let connectedChainId: number; - return createConnector(config => ({ - id: burnerWalletId, - name: burnerWalletName, - type: "burnerWallet", - async connect({ chainId } = {}) { - const provider = await this.getProvider(); - const accounts = await provider.request({ - method: "eth_accounts", - }); - let currentChainId = await this.getChainId(); - if (chainId && currentChainId !== chainId && this.switchChain) { - const chain = await this.switchChain({ chainId }); - currentChainId = chain.id; - } - connected = true; - return { accounts, chainId: currentChainId }; - }, - async getProvider({ chainId } = {}) { - const chain = config.chains.find(x => x.id === chainId) ?? config.chains[0]; - - const url = chain.rpcUrls.default.http[0]; - const burnerAccount = privateKeyToAccount(loadBurnerSK()); - const client = createWalletClient({ - chain: chain, - account: burnerAccount, - transport: http(), - }); - - const request: EIP1193RequestFn = async ({ method, params }) => { - if (method === "eth_sendTransaction") { - const actualParams = (params as SendTransactionParameters[])[0]; - const value = actualParams.value ? hexToBigInt(actualParams.value as unknown as Hex) : undefined; - const hash = await client.sendTransaction({ - ...(params as SendTransactionParameters[])[0], - value, - }); - return hash; - } - - if (method === "eth_accounts") { - return [burnerAccount.address]; - } - - if (method === "wallet_switchEthereumChain") { - type Params = [{ chainId: Hex }]; - connectedChainId = fromHex((params as Params)[0].chainId, "number"); - this.onChainChanged(connectedChainId.toString()); - return; - } - - const body = { method, params }; - const httpClient = getHttpRpcClient(url); - const { error, result } = await httpClient.request({ body }); - if (error) throw new RpcRequestError({ body, error, url }); - - return result; - }; - - return custom({ request })({ retryCount: 0 }); - }, - onChainChanged(chain) { - const chainId = normalizeChainId(chain); - config.emitter.emit("change", { chainId }); - }, - async getAccounts() { - if (!connected) throw new ConnectorNotConnectedError(); - const provider = await this.getProvider(); - const accounts = await provider.request({ method: "eth_accounts" }); - return [accounts.map(x => getAddress(x))[0]]; - }, - async onDisconnect() { - config.emitter.emit("disconnect"); - connected = false; - }, - 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; - }, - onAccountsChanged(accounts) { - if (accounts.length === 0) this.onDisconnect(); - else - config.emitter.emit("change", { - accounts: accounts.map(x => getAddress(x)), - }); - }, - 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) }], - }); - return chain; - }, - disconnect() { - console.log("disconnect from burnerwallet"); - connected = false; - return Promise.resolve(); - }, - ...walletDetails, - })); -}; diff --git a/packages/nextjs/services/web3/wagmiConnectors.tsx b/packages/nextjs/services/web3/wagmiConnectors.tsx index 90d52cabb..816799649 100644 --- a/packages/nextjs/services/web3/wagmiConnectors.tsx +++ b/packages/nextjs/services/web3/wagmiConnectors.tsx @@ -1,4 +1,3 @@ -import { burnerWalletConfig } from "./wagmi-burner/burnerWalletConfig"; import { connectorsForWallets } from "@rainbow-me/rainbowkit"; import { coinbaseWallet, @@ -8,6 +7,7 @@ import { safeWallet, walletConnectWallet, } from "@rainbow-me/rainbowkit/wallets"; +import { rainbowkitBurnerWallet } from "burner-connector"; import * as chains from "viem/chains"; import scaffoldConfig from "~~/scaffold.config"; @@ -21,7 +21,7 @@ const wallets = [ rainbowWallet, safeWallet, ...(!targetNetworks.some(network => network.id !== (chains.hardhat as chains.Chain).id) || !onlyLocalBurnerWallet - ? [burnerWalletConfig] + ? [rainbowkitBurnerWallet] : []), ]; diff --git a/yarn.lock b/yarn.lock index c664a2e64..d0f4d6a04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2060,7 +2060,7 @@ __metadata: languageName: node linkType: hard -"@rainbow-me/rainbowkit@npm:^2.0.2": +"@rainbow-me/rainbowkit@npm:2.0.2, @rainbow-me/rainbowkit@npm:^2.0.2": version: 2.0.2 resolution: "@rainbow-me/rainbowkit@npm:2.0.2" dependencies: @@ -2260,6 +2260,7 @@ __metadata: abitype: ^1.0.2 autoprefixer: ^10.4.12 blo: ^1.0.1 + burner-connector: ^0.0.3 daisyui: 4.5.0 eslint: ^8.15.0 eslint-config-next: ^14.0.4 @@ -4899,6 +4900,17 @@ __metadata: languageName: node linkType: hard +"burner-connector@npm:^0.0.3": + version: 0.0.3 + resolution: "burner-connector@npm:0.0.3" + dependencies: + "@rainbow-me/rainbowkit": 2.0.2 + "@wagmi/core": 2.6.9 + viem: 2.8.16 + checksum: 6041e4aab56af02a01ab211cf278d8babd047db43f4ab43fdb7b9dfd8704d35cbb7da2af240de8b9c782b805031ef43c5788bd0594191b2508f2679dd3ff5041 + languageName: node + linkType: hard + "busboy@npm:1.6.0, busboy@npm:^1.6.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -14633,59 +14645,59 @@ __metadata: languageName: node linkType: hard -"viem@npm:^1.0.0": - version: 1.12.2 - resolution: "viem@npm:1.12.2" +"viem@npm:2.8.16, viem@npm:^2.8.16": + version: 2.8.16 + resolution: "viem@npm:2.8.16" dependencies: - "@adraffy/ens-normalize": 1.9.4 + "@adraffy/ens-normalize": 1.10.0 "@noble/curves": 1.2.0 "@noble/hashes": 1.3.2 "@scure/bip32": 1.3.2 "@scure/bip39": 1.2.1 - "@types/ws": ^8.5.5 - abitype: 0.9.8 - isomorphic-ws: 5.0.0 + abitype: 1.0.0 + isows: 1.0.3 ws: 8.13.0 peerDependencies: typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true - checksum: 558bc2b46afb177a34356f3cc8e6e444f4a6bf4d8aa15658f95eecc1bb42bbc09f240a1fd8eae98fa4973c3a1dc34f0492034b4b4d182f65b2dadf80167c8cea + checksum: f58029cf1f39d662c51f4ebc9c71dc407522161bac2de1112170061d5bfe90ce1802bde701d567022dc1fd83d22ec4df031bcf55d943481159e50acf984292ae languageName: node linkType: hard -"viem@npm:^1.1.4": - version: 1.21.4 - resolution: "viem@npm:1.21.4" +"viem@npm:^1.0.0": + version: 1.12.2 + resolution: "viem@npm:1.12.2" dependencies: - "@adraffy/ens-normalize": 1.10.0 + "@adraffy/ens-normalize": 1.9.4 "@noble/curves": 1.2.0 "@noble/hashes": 1.3.2 "@scure/bip32": 1.3.2 "@scure/bip39": 1.2.1 + "@types/ws": ^8.5.5 abitype: 0.9.8 - isows: 1.0.3 + isomorphic-ws: 5.0.0 ws: 8.13.0 peerDependencies: typescript: ">=5.0.4" peerDependenciesMeta: typescript: optional: true - checksum: c351fdea2d53d2d781ac73c964348b3b9fc5dd46f9eb53903e867705fc9e30a893cb9f2c8d7a00acdcdeca27d14eeebf976eed9f948c28c47018dc9211369117 + checksum: 558bc2b46afb177a34356f3cc8e6e444f4a6bf4d8aa15658f95eecc1bb42bbc09f240a1fd8eae98fa4973c3a1dc34f0492034b4b4d182f65b2dadf80167c8cea languageName: node linkType: hard -"viem@npm:^2.8.16": - version: 2.8.16 - resolution: "viem@npm:2.8.16" +"viem@npm:^1.1.4": + version: 1.21.4 + resolution: "viem@npm:1.21.4" dependencies: "@adraffy/ens-normalize": 1.10.0 "@noble/curves": 1.2.0 "@noble/hashes": 1.3.2 "@scure/bip32": 1.3.2 "@scure/bip39": 1.2.1 - abitype: 1.0.0 + abitype: 0.9.8 isows: 1.0.3 ws: 8.13.0 peerDependencies: @@ -14693,7 +14705,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: f58029cf1f39d662c51f4ebc9c71dc407522161bac2de1112170061d5bfe90ce1802bde701d567022dc1fd83d22ec4df031bcf55d943481159e50acf984292ae + checksum: c351fdea2d53d2d781ac73c964348b3b9fc5dd46f9eb53903e867705fc9e30a893cb9f2c8d7a00acdcdeca27d14eeebf976eed9f948c28c47018dc9211369117 languageName: node linkType: hard