From a1acf646b442e51d323b3ec8103d41e390d4607b Mon Sep 17 00:00:00 2001 From: "Shiv Bhonde | shivbhonde.eth" Date: Sun, 25 Jun 2023 14:09:59 +0530 Subject: [PATCH 1/7] allow writeAsync by useScaffoldContractWrite to be called with updated args (#385) --- .../example-ui/ContractInteraction.tsx | 2 +- .../scaffold-eth/useScaffoldContractWrite.ts | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/packages/nextjs/components/example-ui/ContractInteraction.tsx b/packages/nextjs/components/example-ui/ContractInteraction.tsx index 59f370e84..96c7bcb48 100644 --- a/packages/nextjs/components/example-ui/ContractInteraction.tsx +++ b/packages/nextjs/components/example-ui/ContractInteraction.tsx @@ -66,7 +66,7 @@ export const ContractInteraction = () => { className={`btn btn-primary rounded-full capitalize font-normal font-white w-24 flex items-center gap-1 hover:gap-2 transition-all tracking-widest ${ isLoading ? "loading" : "" }`} - onClick={writeAsync} + onClick={() => writeAsync()} > {!isLoading && ( <> diff --git a/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts b/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts index b065faa2d..53f7b7cd2 100644 --- a/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts +++ b/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts @@ -49,7 +49,15 @@ export const useScaffoldContractWrite = < ...restConfig, }); - const sendContractWriteTx = async () => { + const sendContractWriteTx = async ({ + args, + value, + overrides, + }: { + args?: UseScaffoldWriteConfig["args"]; + value?: UseScaffoldWriteConfig["value"]; + overrides?: UseScaffoldWriteConfig["overrides"]; + } = {}) => { if (!deployedContractData) { notification.error("Target Contract is not deployed, did you forgot to run `yarn deploy`?"); return; @@ -66,7 +74,20 @@ export const useScaffoldContractWrite = < if (wagmiContractWrite.writeAsync) { try { setIsMining(true); - await writeTx(wagmiContractWrite.writeAsync(), { onBlockConfirmation, blockConfirmations }); + await writeTx( + wagmiContractWrite.writeAsync({ + recklesslySetUnpreparedArgs: args as unknown[], + recklesslySetUnpreparedOverrides: + value && overrides + ? { value: utils.parseEther(value), ...overrides } + : value + ? { value: utils.parseEther(value) } + : overrides + ? overrides + : undefined, + }), + { onBlockConfirmation, blockConfirmations }, + ); } catch (e: any) { const message = getParsedEthersError(e); notification.error(message); From 123e6d84ac613e15e07fd854268b6869d7353615 Mon Sep 17 00:00:00 2001 From: "Shiv Bhonde | shivbhonde.eth" Date: Mon, 26 Jun 2023 11:12:14 +0530 Subject: [PATCH 2/7] update wagmi & rainbow for walletConnectV2 (#381) --- packages/nextjs/package.json | 4 +- packages/nextjs/scaffold.config.ts | 7 + .../nextjs/services/web3/wagmiConnectors.tsx | 29 +- yarn.lock | 1265 ++++++----------- 4 files changed, 487 insertions(+), 818 deletions(-) diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 4992572da..d3ebc76a6 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -17,7 +17,7 @@ "@ethersproject/networks": "^5.7.1", "@ethersproject/web": "^5.7.1", "@heroicons/react": "^2.0.11", - "@rainbow-me/rainbowkit": "^0.11.0", + "@rainbow-me/rainbowkit": "^0.12.15", "@uniswap/sdk": "^3.0.3", "daisyui": "^2.31.0", "ethers": "^5.0.0", @@ -31,7 +31,7 @@ "react-hot-toast": "^2.4.0", "use-debounce": "^8.0.4", "usehooks-ts": "^2.7.2", - "wagmi": "^0.11.6", + "wagmi": "^0.12.15", "zustand": "^4.1.2" }, "devDependencies": { diff --git a/packages/nextjs/scaffold.config.ts b/packages/nextjs/scaffold.config.ts index 59c966758..c14d65891 100644 --- a/packages/nextjs/scaffold.config.ts +++ b/packages/nextjs/scaffold.config.ts @@ -4,6 +4,7 @@ export type ScaffoldConfig = { targetNetwork: chains.Chain; pollingInterval: number; alchemyApiKey: string; + walletConnectProjectId: string; burnerWallet: { enabled: boolean; onlyLocal: boolean; @@ -25,6 +26,12 @@ const scaffoldConfig = { // .env.local for local testing, and in the Vercel/system env config for live apps. alchemyApiKey: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY || "oKxs-03sij-U_N0iOlrSsZFr29-IqbuF", + // This is ours WalletConnect's default project ID. + // You can get your own at https://cloud.walletconnect.com + // It's recommended to store it in an env variable: + // .env.local for local testing, and in the Vercel/system env config for live apps. + walletConnectProjectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID || "3a8170812b534d0ff9d794f19a901d64", + // Burner Wallet configuration burnerWallet: { // Set it to false to completely remove burner wallet from all networks diff --git a/packages/nextjs/services/web3/wagmiConnectors.tsx b/packages/nextjs/services/web3/wagmiConnectors.tsx index cb8ce4370..343dd784b 100644 --- a/packages/nextjs/services/web3/wagmiConnectors.tsx +++ b/packages/nextjs/services/web3/wagmiConnectors.tsx @@ -9,7 +9,7 @@ import { } from "@rainbow-me/rainbowkit/wallets"; import { configureChains } from "wagmi"; import * as chains from "wagmi/chains"; -import { alchemyProvider } from "wagmi/providers/alchemy"; +import { jsonRpcProvider } from "wagmi/providers/jsonRpc"; import { publicProvider } from "wagmi/providers/public"; import scaffoldConfig from "~~/scaffold.config"; import { burnerWalletConfig } from "~~/services/web3/wagmi-burner/burnerWalletConfig"; @@ -28,11 +28,17 @@ const enabledChains = export const appChains = configureChains( enabledChains, [ - alchemyProvider({ - apiKey: scaffoldConfig.alchemyApiKey, - priority: 0, + jsonRpcProvider({ + rpc: chain => { + if (chain.rpcUrls.alchemy?.http[0]) { + return { + http: `${chain.rpcUrls.alchemy.http[0]}/${scaffoldConfig.alchemyApiKey}`, + }; + } + return null; + }, }), - publicProvider({ priority: 1 }), + publicProvider(), ], { stallTimeout: 3_000, @@ -45,13 +51,14 @@ export const appChains = configureChains( }, ); +const walletsOptions = { chains: appChains.chains, projectId: scaffoldConfig.walletConnectProjectId }; const wallets = [ - metaMaskWallet({ chains: appChains.chains, shimDisconnect: true }), - walletConnectWallet({ chains: appChains.chains }), - ledgerWallet({ chains: appChains.chains }), - braveWallet({ chains: appChains.chains }), - coinbaseWallet({ appName: "scaffold-eth-2", chains: appChains.chains }), - rainbowWallet({ chains: appChains.chains }), + metaMaskWallet({ ...walletsOptions, shimDisconnect: true }), + walletConnectWallet(walletsOptions), + ledgerWallet(walletsOptions), + braveWallet(walletsOptions), + coinbaseWallet({ ...walletsOptions, appName: "scaffold-eth-2" }), + rainbowWallet(walletsOptions), ]; /** diff --git a/yarn.lock b/yarn.lock index f4fddfc47..bb02a11fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14,13 +14,6 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.19.3": - version: 7.19.3 - resolution: "@babel/compat-data@npm:7.19.3" - checksum: e6014cdb31f3e893a1bde6dd3ae05c8f946778318fa337b18b546ace6f9c9f7a5033fd9447070ebc8e820fa9fc7e0a30d4e354989e091900305a876b44346c8f - languageName: node - linkType: hard - "@babel/generator@npm:7.17.7": version: 7.17.7 resolution: "@babel/generator@npm:7.17.7" @@ -44,36 +37,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.17.7": - version: 7.19.3 - resolution: "@babel/helper-compilation-targets@npm:7.19.3" - dependencies: - "@babel/compat-data": ^7.19.3 - "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.21.3 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: aafcb4490c98cddb3255fff98bfbdb881b4def85a1935fd9b1f9b1f0f8b502696839f6b387fb508ca991ea72ba82ce6913bab99f21df4ce80bda2b79e91a09f5 - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.3.3": - version: 0.3.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.3.3" - dependencies: - "@babel/helper-compilation-targets": ^7.17.7 - "@babel/helper-plugin-utils": ^7.16.7 - debug: ^4.1.1 - lodash.debounce: ^4.0.8 - resolve: ^1.14.2 - semver: ^6.1.2 - peerDependencies: - "@babel/core": ^7.4.0-0 - checksum: 8e3fe75513302e34f6d92bd67b53890e8545e6c5bca8fe757b9979f09d68d7e259f6daea90dc9e01e332c4f8781bda31c5fe551c82a277f9bc0bec007aed497c - languageName: node - linkType: hard - "@babel/helper-environment-visitor@npm:^7.16.7": version: 7.18.9 resolution: "@babel/helper-environment-visitor@npm:7.18.9" @@ -100,22 +63,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-imports@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/helper-plugin-utils@npm:7.19.0" - checksum: eedc996c633c8c207921c26ec2989eae0976336ecd9b9f1ac526498f52b5d136f7cd03c32b6fdf8d46a426f907c142de28592f383c42e5fba1e904cbffa05345 - languageName: node - linkType: hard - "@babel/helper-split-export-declaration@npm:^7.16.7": version: 7.18.6 resolution: "@babel/helper-split-export-declaration@npm:7.18.6" @@ -146,13 +93,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-option@npm:7.18.6" - checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf - languageName: node - linkType: hard - "@babel/highlight@npm:^7.18.6": version: 7.18.6 resolution: "@babel/highlight@npm:7.18.6" @@ -173,22 +113,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.5.5": - version: 7.19.1 - resolution: "@babel/plugin-transform-runtime@npm:7.19.1" - dependencies: - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.19.0 - babel-plugin-polyfill-corejs2: ^0.3.3 - babel-plugin-polyfill-corejs3: ^0.6.0 - babel-plugin-polyfill-regenerator: ^0.4.1 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d9f693003a546b380a7322087490a51e8c6cd47b44e654f5030f96088cf7888b6c746d6335f723581154aaceed4ef0877acfa642f054ce3beb6ba9bb970987f4 - languageName: node - linkType: hard - "@babel/runtime-corejs3@npm:^7.10.2": version: 7.19.1 resolution: "@babel/runtime-corejs3@npm:7.19.1" @@ -208,7 +132,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.9, @babel/runtime@npm:^7.5.5": +"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.2, @babel/runtime@npm:^7.18.9": version: 7.19.0 resolution: "@babel/runtime@npm:7.19.0" dependencies: @@ -285,9 +209,9 @@ __metadata: languageName: node linkType: hard -"@coinbase/wallet-sdk@npm:^3.5.4": - version: 3.6.3 - resolution: "@coinbase/wallet-sdk@npm:3.6.3" +"@coinbase/wallet-sdk@npm:^3.6.6": + version: 3.7.1 + resolution: "@coinbase/wallet-sdk@npm:3.7.1" dependencies: "@metamask/safe-event-emitter": 2.0.0 "@solana/web3.js": ^1.70.1 @@ -295,8 +219,8 @@ __metadata: bn.js: ^5.1.1 buffer: ^6.0.3 clsx: ^1.1.0 - eth-block-tracker: 4.4.3 - eth-json-rpc-filters: 4.2.2 + eth-block-tracker: 6.1.0 + eth-json-rpc-filters: 5.1.0 eth-rpc-errors: 4.0.2 json-rpc-engine: 6.1.0 keccak: ^3.0.1 @@ -306,7 +230,7 @@ __metadata: sha.js: ^2.4.11 stream-browserify: ^3.0.0 util: ^0.12.4 - checksum: f2ffd553f64ced32b9e9cf7fd2ec5708a5a8a4c4e5726787d3499db50cc135912c8565ec3c349b716ad8e9c7efeea682a265ffc365c78074a81345d35347621d + checksum: e88c656d08c06d42dcd03006c62162705a7c7dc27171ee721910f76c15c995f0482a314057a582af6e9548e6f49e4a1aff22f33685a33535c9b2550a615efbaf languageName: node linkType: hard @@ -969,6 +893,13 @@ __metadata: languageName: node linkType: hard +"@lit-labs/ssr-dom-shim@npm:^1.1.0": + version: 1.1.1 + resolution: "@lit-labs/ssr-dom-shim@npm:1.1.1" + checksum: 7a7add78e3ee570a7b987b9bf85e700b20d35d31c8b54cf4c8b2e3c8458ed4e2b0ff328706e5be7887f0ca8a02878c186e76609defb78f0d1b3c0e6b47c9f6ef + languageName: node + linkType: hard + "@lit/reactive-element@npm:^1.3.0, @lit/reactive-element@npm:^1.6.0": version: 1.6.1 resolution: "@lit/reactive-element@npm:1.6.1" @@ -1044,6 +975,18 @@ __metadata: languageName: node linkType: hard +"@metamask/utils@npm:^3.0.1": + version: 3.6.0 + resolution: "@metamask/utils@npm:3.6.0" + dependencies: + "@types/debug": ^4.1.7 + debug: ^4.3.4 + semver: ^7.3.8 + superstruct: ^1.0.3 + checksum: 1ebc6677bb017e4d09d4af143621fe27194d8ed815234cfd76469c3c734dc1db2ea7b577c01a2096c21c04d8c9c4d721d3035b5353fe2ded3b4737f326755e43 + languageName: node + linkType: hard + "@motionone/animation@npm:^10.15.1": version: 10.15.1 resolution: "@motionone/animation@npm:10.15.1" @@ -1056,9 +999,9 @@ __metadata: languageName: node linkType: hard -"@motionone/dom@npm:^10.15.5": - version: 10.15.5 - resolution: "@motionone/dom@npm:10.15.5" +"@motionone/dom@npm:^10.16.2": + version: 10.16.2 + resolution: "@motionone/dom@npm:10.16.2" dependencies: "@motionone/animation": ^10.15.1 "@motionone/generators": ^10.15.1 @@ -1066,7 +1009,7 @@ __metadata: "@motionone/utils": ^10.15.1 hey-listen: ^1.0.8 tslib: ^2.3.1 - checksum: 2453fe3df6a2b4b339d075bcd598bda1eee1926ba0ad881edfd154362b0992c91f31c08d83c469c7e8cb8bf8ebc0ed5530972673cf5c74d99e46e3772cf5f1cb + checksum: c75a7de62cd8af575634644bbc2c5abe606ff9000550e7b8d5a62ea691a0784bf18f57035bd1fad4b0148dbdc6db033f2565b6c8f80b87b40fbb232db8fe93aa languageName: node linkType: hard @@ -1091,13 +1034,13 @@ __metadata: languageName: node linkType: hard -"@motionone/svelte@npm:^10.15.5": - version: 10.15.5 - resolution: "@motionone/svelte@npm:10.15.5" +"@motionone/svelte@npm:^10.16.2": + version: 10.16.2 + resolution: "@motionone/svelte@npm:10.16.2" dependencies: - "@motionone/dom": ^10.15.5 + "@motionone/dom": ^10.16.2 tslib: ^2.3.1 - checksum: 17c7cf75f9c2635b1f11204fc4944a62b6febe19d9ffca50b15b45019e98d74cb9c7b9c1a780d8dbd945d8f397ebc3ff97a765d16cad7aae99d1ec979c3aa5ad + checksum: 066570d991444f9b8e70189b488d563260cf7aadc2e4718e60b66e2871ad0d798e4a39282035c7f0d35a6b2118c36ee222446a8ae0919265860f0d808fcd2837 languageName: node linkType: hard @@ -1119,13 +1062,13 @@ __metadata: languageName: node linkType: hard -"@motionone/vue@npm:^10.15.5": - version: 10.15.5 - resolution: "@motionone/vue@npm:10.15.5" +"@motionone/vue@npm:^10.16.2": + version: 10.16.2 + resolution: "@motionone/vue@npm:10.16.2" dependencies: - "@motionone/dom": ^10.15.5 + "@motionone/dom": ^10.16.2 tslib: ^2.3.1 - checksum: c87c019edfa1224aed7f2edf3f0f764829eeebbc6efefeca2235a5cabbd1553b7516376c744a39e1f7e6b13a7699bceac02c7cb59091d4d1019d5e9dd11c8cf2 + checksum: 37732f679bdf84debb36493e12fe2604ca3d1812ce8271e39dbe28bb4e59d71841d6821a5f5dd07ded918e260f8567842b835ea597572a38007e8a11106d1f0f languageName: node linkType: hard @@ -1709,9 +1652,9 @@ __metadata: languageName: node linkType: hard -"@rainbow-me/rainbowkit@npm:^0.11.0": - version: 0.11.0 - resolution: "@rainbow-me/rainbowkit@npm:0.11.0" +"@rainbow-me/rainbowkit@npm:^0.12.15": + version: 0.12.15 + resolution: "@rainbow-me/rainbowkit@npm:0.12.15" dependencies: "@vanilla-extract/css": 1.9.1 "@vanilla-extract/dynamic": 2.0.2 @@ -1720,11 +1663,11 @@ __metadata: qrcode: 1.5.0 react-remove-scroll: 2.5.4 peerDependencies: - ethers: ">=5.5.1" + ethers: ">=5.6.8" react: ">=17" react-dom: ">=17" - wagmi: 0.11.x - checksum: 696d8a9458d869bd13097f75d5c10694bb40f4353fc6b59f2e78549f2879ace3dee1add8d3c655131f5f1fabc93141f80b2c419315725bc2d1d6ca7492d25326 + wagmi: 0.12.x + checksum: c871f35dd68fb118d2d1af914df86c00eb17acc569d71e1b127910b3bababac264f22abc574f75173a5e1e4b57214543b8c3b67257e1d7593eb71d4d4e280b09 languageName: node linkType: hard @@ -1860,7 +1803,7 @@ __metadata: "@ethersproject/networks": ^5.7.1 "@ethersproject/web": ^5.7.1 "@heroicons/react": ^2.0.11 - "@rainbow-me/rainbowkit": ^0.11.0 + "@rainbow-me/rainbowkit": ^0.12.15 "@trivago/prettier-plugin-sort-imports": ^4.1.1 "@types/node": ^17.0.35 "@types/react": ^18.0.9 @@ -1890,7 +1833,7 @@ __metadata: use-debounce: ^8.0.4 usehooks-ts: ^2.7.2 vercel: ^28.15.1 - wagmi: ^0.11.6 + wagmi: ^0.12.15 zustand: ^4.1.2 languageName: unknown linkType: soft @@ -2198,47 +2141,47 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:4.22.0": - version: 4.22.0 - resolution: "@tanstack/query-core@npm:4.22.0" - checksum: d24c13f8e21b65380230055a6673ae670aca5ee550c2f9a24b89fd3ac5243b465bb25f61b29da8ca285fc7fb0f4c2f8add3864f742eafac5131e777f3e52767a +"@tanstack/query-core@npm:4.29.14": + version: 4.29.14 + resolution: "@tanstack/query-core@npm:4.29.14" + checksum: 3f74b2a02a7ac3b5d5f01507dc5ed15af539257005fc299ae4e4ef578feb347ab737ed5beb542c809c8f2838ae4d8626f6bf5d7d134173e0b8504c0900d0d9f6 languageName: node linkType: hard -"@tanstack/query-persist-client-core@npm:4.22.0": - version: 4.22.0 - resolution: "@tanstack/query-persist-client-core@npm:4.22.0" - peerDependencies: - "@tanstack/query-core": 4.22.0 - checksum: d5e274b52b5e463f7b3d0383dc6c380f3714bfd9d63d3b8bd7c3d318a97b4d61d43d4a15776c1fc20ec94805ffac2eab55832c74c79a2d11c05169e43b85652b +"@tanstack/query-persist-client-core@npm:4.29.14": + version: 4.29.14 + resolution: "@tanstack/query-persist-client-core@npm:4.29.14" + dependencies: + "@tanstack/query-core": 4.29.14 + checksum: 34ca10ee241596ec5375590606edba76c15a0333d3545514a9562e2e4c291fd7a7fb8101e66ee794cd31d143e248de3523d3873db484448b782a5b2c7839ba97 languageName: node linkType: hard -"@tanstack/query-sync-storage-persister@npm:^4.14.5": - version: 4.22.0 - resolution: "@tanstack/query-sync-storage-persister@npm:4.22.0" +"@tanstack/query-sync-storage-persister@npm:^4.27.1": + version: 4.29.14 + resolution: "@tanstack/query-sync-storage-persister@npm:4.29.14" dependencies: - "@tanstack/query-persist-client-core": 4.22.0 - checksum: dc37d37347503a57b8c59becb5192a557dcab734e265645e09edf4a59bcf199a8631a4c32ef43b987f79aed9d9970184f5cfb9eb0abd0837c64c0d7d763d1f10 + "@tanstack/query-persist-client-core": 4.29.14 + checksum: ba0d3a32688310cbe91cf1157002ec697e0b073d52a6313174c456e02008ac75052ea28111721257a1f29d8701c96bacc6868b543ea8381f99d8943ed1d4e140 languageName: node linkType: hard -"@tanstack/react-query-persist-client@npm:^4.14.5": - version: 4.22.0 - resolution: "@tanstack/react-query-persist-client@npm:4.22.0" +"@tanstack/react-query-persist-client@npm:^4.28.0": + version: 4.29.14 + resolution: "@tanstack/react-query-persist-client@npm:4.29.14" dependencies: - "@tanstack/query-persist-client-core": 4.22.0 + "@tanstack/query-persist-client-core": 4.29.14 peerDependencies: - "@tanstack/react-query": 4.22.0 - checksum: 5035253a4bba5f21d0e992339575809de2b7b2662d771fae9eebda251947f9ddd475352f3ca730b3a082fcc35c3b244aeb6aad2e170670dd32c6ab715d902d15 + "@tanstack/react-query": 4.29.14 + checksum: b21f6b2a4210be429e7aa03f315e6ef580b64489056cd1a523110385682aaaedf15984f6fc159bd67aa9498beba2e34bfe112aaa7dcacb12399169171f20970b languageName: node linkType: hard -"@tanstack/react-query@npm:^4.14.5": - version: 4.22.0 - resolution: "@tanstack/react-query@npm:4.22.0" +"@tanstack/react-query@npm:^4.28.0": + version: 4.29.14 + resolution: "@tanstack/react-query@npm:4.29.14" dependencies: - "@tanstack/query-core": 4.22.0 + "@tanstack/query-core": 4.29.14 use-sync-external-store: ^1.2.0 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -2249,7 +2192,7 @@ __metadata: optional: true react-native: optional: true - checksum: b146774b44a79dd5a6412d981ce04790e66da5a36f907a03c85c36f50a38fb4e4dfbfca7b1561c86b39fb0df1c0c1ae0a0ef2930c06b444da3f430b9bad450f1 + checksum: 2444cd11dbbb9e6811e845505bd55d0f4b63f39f6067f5b3a65b18ed66d945128d84988df3b7aaae7adc5636fd0909af86bbc184b6101d395136f8bd14509593 languageName: node linkType: hard @@ -2412,6 +2355,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.1.7": + version: 4.1.8 + resolution: "@types/debug@npm:4.1.8" + dependencies: + "@types/ms": "*" + checksum: a9a9bb40a199e9724aa944e139a7659173a9b274798ea7efbc277cb084bc37d32fc4c00877c3496fac4fed70a23243d284adb75c00b5fdabb38a22154d18e5df + languageName: node + linkType: hard + "@types/eslint@npm:^8": version: 8.4.8 resolution: "@types/eslint@npm:8.4.8" @@ -2483,6 +2435,13 @@ __metadata: languageName: node linkType: hard +"@types/ms@npm:*": + version: 0.7.31 + resolution: "@types/ms@npm:0.7.31" + checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da + languageName: node + linkType: hard + "@types/node@npm:*": version: 18.7.23 resolution: "@types/node@npm:18.7.23" @@ -3168,29 +3127,29 @@ __metadata: languageName: node linkType: hard -"@wagmi/chains@npm:0.2.8": - version: 0.2.8 - resolution: "@wagmi/chains@npm:0.2.8" +"@wagmi/chains@npm:0.2.22": + version: 0.2.22 + resolution: "@wagmi/chains@npm:0.2.22" peerDependencies: typescript: ">=4.9.4" peerDependenciesMeta: typescript: optional: true - checksum: f68b16fa0620fe4162ad3412735a5c239f59c9a7b15e900a217ff7403d74c8a262fdcd77ab0b37cbc747e78c2c197272d9340d9ef091525d5e335e91905d3def + checksum: a8fdbce18f2ed8cce6c765828b78ef59756e3d4dc858af07f42827e78d8ab5b4ab3da2c79cd7cd3f534a6b27edd5bb5f764e6250394b4ae6aa0a055b7bdc518a languageName: node linkType: hard -"@wagmi/connectors@npm:0.2.6": - version: 0.2.6 - resolution: "@wagmi/connectors@npm:0.2.6" +"@wagmi/connectors@npm:0.3.21": + version: 0.3.21 + resolution: "@wagmi/connectors@npm:0.3.21" dependencies: - "@coinbase/wallet-sdk": ^3.5.4 + "@coinbase/wallet-sdk": ^3.6.6 "@ledgerhq/connect-kit-loader": ^1.0.1 "@safe-global/safe-apps-provider": ^0.15.2 "@safe-global/safe-apps-sdk": ^7.9.0 - "@walletconnect/ethereum-provider": ^1.8.0 - "@walletconnect/universal-provider": 2.3.3 - "@web3modal/standalone": ^2.1.1 + "@walletconnect/ethereum-provider": 2.8.1 + "@walletconnect/legacy-provider": ^2.0.0 + "@walletconnect/modal": ^2.4.6 abitype: ^0.3.0 eventemitter3: ^4.0.7 peerDependencies: @@ -3202,16 +3161,16 @@ __metadata: optional: true typescript: optional: true - checksum: 48c763d4b8ac072bce36df52de3c847f3fb61261c340e5cff58ffdefa0b686c07059f76c3fc6cd32e04fff417109ec97e115f7e80812fec6422094f4eca5cfae + checksum: 1a3111c9c4d3c168113a46035d49bd31c7adfe55ee3e2c64719570ee3868329121915fce2b9e1fde8d9a7c0fa5afb6177a71a143ee60c6a1c0812de9823f3564 languageName: node linkType: hard -"@wagmi/core@npm:0.9.6": - version: 0.9.6 - resolution: "@wagmi/core@npm:0.9.6" +"@wagmi/core@npm:0.10.14": + version: 0.10.14 + resolution: "@wagmi/core@npm:0.10.14" dependencies: - "@wagmi/chains": 0.2.8 - "@wagmi/connectors": 0.2.6 + "@wagmi/chains": 0.2.22 + "@wagmi/connectors": 0.3.21 abitype: ^0.3.0 eventemitter3: ^4.0.7 zustand: ^4.3.1 @@ -3221,97 +3180,56 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 3d052510dbb513d564308cb1374bc99cabd6ba18005d969799c9ead054ab5c177901eb23350b08bfd6a2a2faa0c08bd89fde62bb8b96f9141e71060b960608f2 - languageName: node - linkType: hard - -"@walletconnect/browser-utils@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/browser-utils@npm:1.8.0" - dependencies: - "@walletconnect/safe-json": 1.0.0 - "@walletconnect/types": ^1.8.0 - "@walletconnect/window-getters": 1.0.0 - "@walletconnect/window-metadata": 1.0.0 - detect-browser: 5.2.0 - checksum: cf4b55c9e8d53b1ffa99322ebcdfce7ad8df8e3ee90f57252da0b3882d3bfb592414cad09900c20619216c6a42d1184ad03728e6514e95a34467a8821aa5aef8 + checksum: 33f2b37ec451c367ac339a1b811d0bacfb3bb4d7b47037ceeeb9b39dab952c53750dcff0e7f1a76c8d849f90560df79025e4867244b407b1ceedd986b05c0574 languageName: node linkType: hard -"@walletconnect/client@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/client@npm:1.8.0" +"@walletconnect/core@npm:2.8.1": + version: 2.8.1 + resolution: "@walletconnect/core@npm:2.8.1" dependencies: - "@walletconnect/core": ^1.8.0 - "@walletconnect/iso-crypto": ^1.8.0 - "@walletconnect/types": ^1.8.0 - "@walletconnect/utils": ^1.8.0 - checksum: 48aab7d11eeaaccf6612d335766eb6439f2ce3c446a87b7a974b6fb11076d3bc000f947c0822790fdaa6ba50df073c581750eb5dcda47359bf29c94b76919394 - languageName: node - linkType: hard - -"@walletconnect/core@npm:2.3.3": - version: 2.3.3 - resolution: "@walletconnect/core@npm:2.3.3" - dependencies: - "@walletconnect/heartbeat": 1.2.0 - "@walletconnect/jsonrpc-provider": ^1.0.6 - "@walletconnect/jsonrpc-utils": ^1.0.4 - "@walletconnect/jsonrpc-ws-connection": ^1.0.6 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-provider": 1.0.13 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/jsonrpc-ws-connection": ^1.0.11 "@walletconnect/keyvaluestorage": ^1.0.2 "@walletconnect/logger": ^2.0.1 - "@walletconnect/relay-api": ^1.0.7 + "@walletconnect/relay-api": ^1.0.9 "@walletconnect/relay-auth": ^1.0.4 - "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/safe-json": ^1.0.2 "@walletconnect/time": ^1.0.2 - "@walletconnect/types": 2.3.3 - "@walletconnect/utils": 2.3.3 + "@walletconnect/types": 2.8.1 + "@walletconnect/utils": 2.8.1 events: ^3.3.0 lodash.isequal: 4.5.0 - pino: 7.11.0 - uint8arrays: 3.1.0 - checksum: 231b954404626cd720fdd726d71aaf33691bb776f9d48c387c89a99258fbce24f9c1190dd0ee9a44805fa21aa1cdbd7e63d88939fc776a4ce0b2376b492460ba - languageName: node - linkType: hard - -"@walletconnect/core@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/core@npm:1.8.0" - dependencies: - "@walletconnect/socket-transport": ^1.8.0 - "@walletconnect/types": ^1.8.0 - "@walletconnect/utils": ^1.8.0 - checksum: 2d703ac417c1f0df33f35893aef24fd4ce7e1d9b274f6937dcdf0880ff46bf266e773e498f374e5f17a1e249c55e7c7af815c63676c5cea5fda737f326a28c14 + uint8arrays: ^3.1.0 + checksum: 4f7603e510c8ab4acd0ec380740a872921a0b7fc053ef9920f405172c071259bc167fa06952d51244322caa7e282ec9debd8794b7fd3c703e3f1d1e7c7f4e512 languageName: node linkType: hard -"@walletconnect/crypto@npm:^1.0.2": - version: 1.0.2 - resolution: "@walletconnect/crypto@npm:1.0.2" +"@walletconnect/crypto@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/crypto@npm:1.0.3" dependencies: - "@walletconnect/encoding": ^1.0.1 - "@walletconnect/environment": ^1.0.0 - "@walletconnect/randombytes": ^1.0.2 + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/environment": ^1.0.1 + "@walletconnect/randombytes": ^1.0.3 aes-js: ^3.1.2 hash.js: ^1.1.7 - checksum: bd2987b88069c25297847b2e963ccfe220400f30ac29b5d4a6021b97e826451c4b91ffe742ef9c98bab188c4b1422c43c2d4db6360f962e617f0152bf150853b + tslib: 1.14.1 + checksum: 056c80451178d74be6237f24e53eb96951379ad2f556642b4f07231a9cac53512af182dfb58ee359d1d6803231030de747eb17b35a9a25577e20de3ef2d8fdec languageName: node linkType: hard -"@walletconnect/encoding@npm:^1.0.1": - version: 1.0.1 - resolution: "@walletconnect/encoding@npm:1.0.1" +"@walletconnect/encoding@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/encoding@npm:1.0.2" dependencies: is-typedarray: 1.0.0 + tslib: 1.14.1 typedarray-to-buffer: 3.1.5 - checksum: 964a9e0884a22604284da60b88212d6c9466bff5d4ed8a29064e6602d138ee30989973f016c314731f0fab534a4e24d3b352ef8bff522d9c04d35b0b20916c25 - languageName: node - linkType: hard - -"@walletconnect/environment@npm:^1.0.0": - version: 1.0.0 - resolution: "@walletconnect/environment@npm:1.0.0" - checksum: ba553bbaaf39fe6318a519d6cbb3a39e74cd55d24f24e31b02c35c579101156936b7180613e3bc8f82bf82e768ab5af9fc5991b673da9a0546aedd2940e581a0 + checksum: 648029d6a04e0e3675e1220b87c982e5d69764873e30a45a7c57f18223cd7c13e6758138d4644fd05d8fa03bd438fafb0a0ebc6ae168ed6f4a9bf1f93de1b82f languageName: node linkType: hard @@ -3324,19 +3242,25 @@ __metadata: languageName: node linkType: hard -"@walletconnect/ethereum-provider@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/ethereum-provider@npm:1.8.0" - dependencies: - "@walletconnect/client": ^1.8.0 - "@walletconnect/jsonrpc-http-connection": ^1.0.2 - "@walletconnect/jsonrpc-provider": ^1.0.5 - "@walletconnect/signer-connection": ^1.8.0 - "@walletconnect/types": ^1.8.0 - "@walletconnect/utils": ^1.8.0 - eip1193-provider: 1.0.1 - eventemitter3: 4.0.7 - checksum: eaf8a113498673d023fc96bec1248bc9640d0bd78beea906f4d9dc5388db236c1436c00301e30f7b46abec59b22e0bb6d72e5a08837d3d021f096677a89005d6 +"@walletconnect/ethereum-provider@npm:2.8.1": + version: 2.8.1 + resolution: "@walletconnect/ethereum-provider@npm:2.8.1" + dependencies: + "@walletconnect/jsonrpc-http-connection": ^1.0.7 + "@walletconnect/jsonrpc-provider": ^1.0.13 + "@walletconnect/jsonrpc-types": ^1.0.3 + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/sign-client": 2.8.1 + "@walletconnect/types": 2.8.1 + "@walletconnect/universal-provider": 2.8.1 + "@walletconnect/utils": 2.8.1 + events: ^3.3.0 + peerDependencies: + "@walletconnect/modal": ">=2" + peerDependenciesMeta: + "@walletconnect/modal": + optional: true + checksum: 5dcc3ca4ea0f46d2b1c97fd74ed037b5e15e0d0a7b892f3e862143d60c6cf689c92aee0a30b381fab4d9fc853a1180bed657fa8d96fd5394daa2c05407ef45bb languageName: node linkType: hard @@ -3350,39 +3274,14 @@ __metadata: languageName: node linkType: hard -"@walletconnect/heartbeat@npm:1.2.0": - version: 1.2.0 - resolution: "@walletconnect/heartbeat@npm:1.2.0" +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" dependencies: "@walletconnect/events": ^1.0.1 "@walletconnect/time": ^1.0.2 - chai: ^4.3.7 - mocha: ^10.2.0 - ts-node: ^10.9.1 tslib: 1.14.1 - checksum: 27a0efa0a9e3e073ae824dff4480b13ee878e09f949c0c18cb1cc344163ea501b3ef2602901e50062d5e7dba348632405de7f07a83313d2acce203a11a8b1a40 - languageName: node - linkType: hard - -"@walletconnect/iso-crypto@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/iso-crypto@npm:1.8.0" - dependencies: - "@walletconnect/crypto": ^1.0.2 - "@walletconnect/types": ^1.8.0 - "@walletconnect/utils": ^1.8.0 - checksum: ec1b361831c60b7d91d7be001d2b62266df64cd62710840ebf54193d008b46c70bde3d42d7e0df6107f020d4b0470435bfbb3defb9e918fdcb1b0f3eaf42e52f - languageName: node - linkType: hard - -"@walletconnect/jsonrpc-http-connection@npm:^1.0.2": - version: 1.0.3 - resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.3" - dependencies: - "@walletconnect/jsonrpc-utils": ^1.0.3 - "@walletconnect/safe-json": ^1.0.0 - cross-fetch: ^3.1.4 - checksum: 7462c9539fcd498695a0076a725bba2bfb69da16e8289588c30b88ee97514fd370328848f2db20adb45c4392fa019a16ca779f05c9f3d4422c0a46dce9de3b82 + checksum: df4d492a2d336283f834bc205c09b795f85cd507a61b14745dc2124e510a250fefbd83d51216f93df2e0aa0cf8120134db2679de8019eddd63877e9928997952 languageName: node linkType: hard @@ -3398,13 +3297,26 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-provider@npm:^1.0.5": - version: 1.0.5 - resolution: "@walletconnect/jsonrpc-provider@npm:1.0.5" +"@walletconnect/jsonrpc-http-connection@npm:^1.0.7": + version: 1.0.7 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.7" dependencies: - "@walletconnect/jsonrpc-utils": ^1.0.3 - "@walletconnect/safe-json": ^1.0.0 - checksum: 2a7b5dd3ab9e38d2f805b846cba657fbc0cade495faa2ad1e80d94947b48e0b42730e8ab01654384b5b4ce9e6814e03df44329e4c0edd5b5c12ab565795e9b1d + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.1 + cross-fetch: ^3.1.4 + tslib: 1.14.1 + checksum: c4efcd46d4b344727ca6879badca2c2f855499ac76c8dace5d118f4423167adce34e41a99f3dcab0febb945ce51c6ef0ac8556567d5e38d8dad864b131eb5b00 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-provider@npm:1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.13": + version: 1.0.13 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.13" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/safe-json": ^1.0.2 + tslib: 1.14.1 + checksum: 497dfdd9f988432f171bc98336f3583c679059f0a166f95d6e51c8e1937c17abd9a5fd3aadfcebf6964bae14edd1e05fb0453e370d6e3bbc7ff4919fcad7c478 languageName: node linkType: hard @@ -3419,12 +3331,13 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-types@npm:^1.0.1": - version: 1.0.1 - resolution: "@walletconnect/jsonrpc-types@npm:1.0.1" +"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" dependencies: keyvaluestorage-interface: ^1.0.0 - checksum: 89ae6378541772b1c2ea4a217b017ae56dc0fba79222cc35cd4ad04f83af8d18834c46ef1c9f8d1fbebd5bf61e2133e4538d81636c64b10a6e14e46b25a3a1ff + tslib: 1.14.1 + checksum: 26e6f1d8f4207328d3df465c36d0d67844772863dc8e9e78e6cfec417cfc359300eab049d99ea558982b3f0948f4ca26b75253bdf635ffd82ffe30a5276b790c languageName: node linkType: hard @@ -3438,13 +3351,14 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-utils@npm:^1.0.3": - version: 1.0.3 - resolution: "@walletconnect/jsonrpc-utils@npm:1.0.3" +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" dependencies: - "@walletconnect/environment": ^1.0.0 - "@walletconnect/jsonrpc-types": ^1.0.1 - checksum: 143e7ea1829165d4e86a674a96b7355c1e188a02a729d58d476baf0a24b21e7d1f55507682f3517ade57d1bd89be1359423d977dbf5265c3b39e16e0f62e3e73 + "@walletconnect/environment": ^1.0.1 + "@walletconnect/jsonrpc-types": ^1.0.3 + tslib: 1.14.1 + checksum: f43a85dfce8150c3e3d1f009e8d8241ab8e10b026ea435f0918edf4db6b3a17586ba9d9c54a93cc61e4d3c685611e5bd5954fc377a581af503acd38e6d84c2ef languageName: node linkType: hard @@ -3459,16 +3373,16 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-ws-connection@npm:^1.0.6": - version: 1.0.6 - resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.6" +"@walletconnect/jsonrpc-ws-connection@npm:^1.0.11": + version: 1.0.11 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.11" dependencies: - "@walletconnect/jsonrpc-utils": ^1.0.4 - "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.2 events: ^3.3.0 tslib: 1.14.1 ws: ^7.5.1 - checksum: 491cd99abbd3d12d0a9915a551d6a8cefb0d6f27d24e2ab67435fb85fbac4d964a73640c922c665c627bedeb0e2575232a1c6cb11499e0a25a10a35f5bf3b599 + checksum: 69fcc5ecb6eafd697fb88e22e6b7a2fd24d06129860feb6bcb5f702062233ebf5aef8b86a8502c67158f48370b98d0f5dffd930a0e5f6944752eb6a3c37a40cb languageName: node linkType: hard @@ -3490,6 +3404,76 @@ __metadata: languageName: node linkType: hard +"@walletconnect/legacy-client@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-client@npm:2.0.0" + dependencies: + "@walletconnect/crypto": ^1.0.3 + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/jsonrpc-utils": ^1.0.4 + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/legacy-utils": ^2.0.0 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: ^5.3.0 + query-string: ^6.13.5 + checksum: 57de9e373b24766e937734989080eb6d476e40d5406d4f817c989b278f25a09aa8636dfbe34a33f4de80ef90aea9641fdb7841007ecdba8e5ad47cd11614ee94 + languageName: node + linkType: hard + +"@walletconnect/legacy-modal@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-modal@npm:2.0.0" + dependencies: + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/legacy-utils": ^2.0.0 + copy-to-clipboard: ^3.3.3 + preact: ^10.12.0 + qrcode: ^1.5.1 + checksum: 897a02c9f4129a8f0b8e37832bf49a408e7e6f2828e78bea90c3718471cb57558f5522dd69c19456b5cc54a4aa04a4f7942f262ad9b031d318a5498ca0ca4078 + languageName: node + linkType: hard + +"@walletconnect/legacy-provider@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-provider@npm:2.0.0" + dependencies: + "@walletconnect/jsonrpc-http-connection": ^1.0.4 + "@walletconnect/jsonrpc-provider": ^1.0.6 + "@walletconnect/legacy-client": ^2.0.0 + "@walletconnect/legacy-modal": ^2.0.0 + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/legacy-utils": ^2.0.0 + checksum: 48adf2d938d3580be1dbaa4c7005cdf715896a56d3f4ab500c301cd5b442343c7df11bfccbc8e32bf9a7ba4b9a379208846ad848d79b1b6b511c1c4121fc83cf + languageName: node + linkType: hard + +"@walletconnect/legacy-types@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-types@npm:2.0.0" + dependencies: + "@walletconnect/jsonrpc-types": ^1.0.2 + checksum: 358d789f8a50e689edcfd8eb668fcdf8e1f03ab08757b12fad0e658ce7ef62268f8022502b476bce69e5165aa4454c4ad1ea41f17244ab8d0fcd9026bd94707c + languageName: node + linkType: hard + +"@walletconnect/legacy-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "@walletconnect/legacy-utils@npm:2.0.0" + dependencies: + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/jsonrpc-utils": ^1.0.4 + "@walletconnect/legacy-types": ^2.0.0 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: ^5.3.0 + query-string: ^6.13.5 + checksum: ea90e98c2f2f0a7f1d8801f7284bae909952979413b5d8e339004948199a2777af025195442a3c78a27aa3c16bb546ef54bf9c592e5622e1f003bef6d4b355ca + languageName: node + linkType: hard + "@walletconnect/logger@npm:^2.0.1": version: 2.0.1 resolution: "@walletconnect/logger@npm:2.0.1" @@ -3500,45 +3484,35 @@ __metadata: languageName: node linkType: hard -"@walletconnect/mobile-registry@npm:^1.4.0": - version: 1.4.0 - resolution: "@walletconnect/mobile-registry@npm:1.4.0" - checksum: 06f18842e68f88e71e87f36daea143684afc49551974cf359fb55cc731e9b4fc0bce762d87b79b268e529def889e82fc2fbc2bc12d6a28a04ed0d6a060188020 - languageName: node - linkType: hard - -"@walletconnect/qrcode-modal@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/qrcode-modal@npm:1.8.0" +"@walletconnect/modal@npm:^2.4.6": + version: 2.4.7 + resolution: "@walletconnect/modal@npm:2.4.7" dependencies: - "@walletconnect/browser-utils": ^1.8.0 - "@walletconnect/mobile-registry": ^1.4.0 - "@walletconnect/types": ^1.8.0 - copy-to-clipboard: ^3.3.1 - preact: 10.4.1 - qrcode: 1.4.4 - checksum: 0abae2268579f55da87ed766fee32d428f951f18ab0a4addbfe8cbcbad1ce3a5642cc26ceb80654b158e537000ee5006b14eff43515619bc17af8c5da51adc55 + "@web3modal/core": 2.4.7 + "@web3modal/ui": 2.4.7 + checksum: bf32b2ff50fb01e66f300b23ba2455a72f6741e2176a093db88dea4c86811c3791998a6a23816c95ecffa55bd715dd7410d96194c04f3d3cd22a4e2f8949efae languageName: node linkType: hard -"@walletconnect/randombytes@npm:^1.0.2": - version: 1.0.2 - resolution: "@walletconnect/randombytes@npm:1.0.2" +"@walletconnect/randombytes@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/randombytes@npm:1.0.3" dependencies: - "@walletconnect/encoding": ^1.0.1 - "@walletconnect/environment": ^1.0.0 + "@walletconnect/encoding": ^1.0.2 + "@walletconnect/environment": ^1.0.1 randombytes: ^2.1.0 - checksum: bd76b68238ab5b8e787dffa574ecfa579fdf61b2d933a0a909fbe9a89519dce1dda63fa38ded2e62c0c9090f9e61951c1fc7839e6ad56a9d173d9c15f59930d2 + tslib: 1.14.1 + checksum: 3ba1d5906299256c64affcd03348ec1397e2fadb1e60baaa13d4f46ba0267580fc354e67839d3fa4faa8abb375723f7ab96334b4e842f5814ce2080ed15f3578 languageName: node linkType: hard -"@walletconnect/relay-api@npm:^1.0.7": - version: 1.0.7 - resolution: "@walletconnect/relay-api@npm:1.0.7" +"@walletconnect/relay-api@npm:^1.0.9": + version: 1.0.9 + resolution: "@walletconnect/relay-api@npm:1.0.9" dependencies: "@walletconnect/jsonrpc-types": ^1.0.2 tslib: 1.14.1 - checksum: 5078d60ece3215326be9c0bd79e605256b7e6f1407c4abf848769b038f3bdb82490cb47523b142797269fc48f4ccab726826ba8e4fad25feb8722c73a43d403f + checksum: 5870579b6552f1ce7351878f1acb8386b0c11288c64d39133c7cee5040feeb7ccf9114228d97a59749d60366ad107b097d656407d534567c24f5d3878ea6e246 languageName: node linkType: hard @@ -3556,13 +3530,6 @@ __metadata: languageName: node linkType: hard -"@walletconnect/safe-json@npm:1.0.0, @walletconnect/safe-json@npm:^1.0.0": - version: 1.0.0 - resolution: "@walletconnect/safe-json@npm:1.0.0" - checksum: a8ee161cad37242983522d19ace57c2d2725b5b1cf5fd4d61e3e5f4190a2b369acc4cd0fa40774b50cf4aa322f477e31b7841a6b8f0d84a3af12da8c4344e9b7 - languageName: node - linkType: hard - "@walletconnect/safe-json@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/safe-json@npm:1.0.1" @@ -3572,47 +3539,29 @@ __metadata: languageName: node linkType: hard -"@walletconnect/sign-client@npm:2.3.3": - version: 2.3.3 - resolution: "@walletconnect/sign-client@npm:2.3.3" - dependencies: - "@walletconnect/core": 2.3.3 - "@walletconnect/events": ^1.0.1 - "@walletconnect/heartbeat": 1.2.0 - "@walletconnect/jsonrpc-provider": ^1.0.6 - "@walletconnect/jsonrpc-utils": ^1.0.4 - "@walletconnect/logger": ^2.0.1 - "@walletconnect/time": ^1.0.2 - "@walletconnect/types": 2.3.3 - "@walletconnect/utils": 2.3.3 - events: ^3.3.0 - pino: 7.11.0 - checksum: 1830fbe41057a63da8ecf85f938c88359e1d4f3ad0dfddfed5222ebd7beda1a77af362cc8c1e0d8aca59194fb46b09baeb9fb775c65d7058d489f26fe10bd271 - languageName: node - linkType: hard - -"@walletconnect/signer-connection@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/signer-connection@npm:1.8.0" +"@walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" dependencies: - "@walletconnect/client": ^1.8.0 - "@walletconnect/jsonrpc-types": ^1.0.1 - "@walletconnect/jsonrpc-utils": ^1.0.3 - "@walletconnect/qrcode-modal": ^1.8.0 - "@walletconnect/types": ^1.8.0 - eventemitter3: 4.0.7 - checksum: 249c5a92e80c59181d2da0dda759a6ed576e347de2cd2b2bf21ac5efe6b7b03e08406c2acc25e066cef52ffb6e6eb4124f6c680905dc54757b6f61f3a725b08f + tslib: 1.14.1 + checksum: fee03fcc70adb5635ab9419ea6ec6555aa2467bef650ad3b9526451c3a5cf247836db0f3ae3bb435d2e585d99e50c2ebe7dc9c429cfa3df900cf3fe4bd06d37f languageName: node linkType: hard -"@walletconnect/socket-transport@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/socket-transport@npm:1.8.0" +"@walletconnect/sign-client@npm:2.8.1": + version: 2.8.1 + resolution: "@walletconnect/sign-client@npm:2.8.1" dependencies: - "@walletconnect/types": ^1.8.0 - "@walletconnect/utils": ^1.8.0 - ws: 7.5.3 - checksum: 3c494399a3fd8165a8d631a66efd19779278dd6744b1e686a18394afad38a05450b9acb0117373e3376ac4721a2a298695fd550db79c1e456d4446e2b53f8a6d + "@walletconnect/core": 2.8.1 + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.8.1 + "@walletconnect/utils": 2.8.1 + events: ^3.3.0 + checksum: 1eecc9dde5aae2034f8c2ba1d1392140f1f9019e7f627ca803f5b126c18655d7b08347147622bdce6bb07355b28893c7f7ddbe13642616238695653da44632df languageName: node linkType: hard @@ -3625,88 +3574,57 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.3.3": - version: 2.3.3 - resolution: "@walletconnect/types@npm:2.3.3" +"@walletconnect/types@npm:2.8.1": + version: 2.8.1 + resolution: "@walletconnect/types@npm:2.8.1" dependencies: "@walletconnect/events": ^1.0.1 - "@walletconnect/heartbeat": 1.2.0 - "@walletconnect/jsonrpc-types": ^1.0.2 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-types": 1.0.3 "@walletconnect/keyvaluestorage": ^1.0.2 "@walletconnect/logger": ^2.0.1 events: ^3.3.0 - checksum: 2c288ad5bde249d8522c1f3168d6dfcae50aac4fda3865919227138a37ac12fd76bbf3c1bf2a9dd176c9782317993fbcc494f85874106715f337547a87ff5e3b + checksum: 8ac30f3e66c67bdd4ea18690eaa6d873bf170544a6bc67cdbbeb849ed3a50778158bf82789d047b983e25bd43c3841c5f0102bf2981fce400f5909e0968f0192 languageName: node linkType: hard -"@walletconnect/types@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/types@npm:1.8.0" - checksum: 194d615888068030183489222641332987846aa5c6bcf0a62fa60ca7a282b9f94932c49fcd2b293a859e98624fe3e7a2d3c5fb66545fe30d3391e7ac91a99e34 - languageName: node - linkType: hard - -"@walletconnect/universal-provider@npm:2.3.3": - version: 2.3.3 - resolution: "@walletconnect/universal-provider@npm:2.3.3" +"@walletconnect/universal-provider@npm:2.8.1": + version: 2.8.1 + resolution: "@walletconnect/universal-provider@npm:2.8.1" dependencies: - "@walletconnect/jsonrpc-http-connection": ^1.0.4 - "@walletconnect/jsonrpc-provider": ^1.0.6 + "@walletconnect/jsonrpc-http-connection": ^1.0.7 + "@walletconnect/jsonrpc-provider": 1.0.13 "@walletconnect/jsonrpc-types": ^1.0.2 - "@walletconnect/jsonrpc-utils": ^1.0.4 + "@walletconnect/jsonrpc-utils": ^1.0.7 "@walletconnect/logger": ^2.0.1 - "@walletconnect/sign-client": 2.3.3 - "@walletconnect/types": 2.3.3 - "@walletconnect/utils": 2.3.3 + "@walletconnect/sign-client": 2.8.1 + "@walletconnect/types": 2.8.1 + "@walletconnect/utils": 2.8.1 eip1193-provider: 1.0.1 events: ^3.3.0 - pino: 7.11.0 - checksum: 09b95373219321d9032aa69e5a67a8354634b23be8ce210008ef93f9dfa8bf1feaf410a2fb19ce34e8fc511d610477677a4795a5000e173221d3b1021073c862 + checksum: 888afcbecd7db44fa7159e33c7e714553029ca88ac2a2848664eabc810bcac95290214137cce7c8661aad326274453a484be8e5f99d469e0bcc35c204c9cd4a6 languageName: node linkType: hard -"@walletconnect/utils@npm:2.3.3": - version: 2.3.3 - resolution: "@walletconnect/utils@npm:2.3.3" +"@walletconnect/utils@npm:2.8.1": + version: 2.8.1 + resolution: "@walletconnect/utils@npm:2.8.1" dependencies: "@stablelib/chacha20poly1305": 1.0.1 "@stablelib/hkdf": 1.0.1 "@stablelib/random": ^1.0.2 "@stablelib/sha256": 1.0.1 "@stablelib/x25519": ^1.0.3 - "@walletconnect/jsonrpc-utils": ^1.0.4 - "@walletconnect/relay-api": ^1.0.7 - "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/safe-json": ^1.0.2 "@walletconnect/time": ^1.0.2 - "@walletconnect/types": 2.3.3 + "@walletconnect/types": 2.8.1 "@walletconnect/window-getters": ^1.0.1 "@walletconnect/window-metadata": ^1.0.1 detect-browser: 5.3.0 - query-string: 7.1.1 - uint8arrays: 3.1.0 - checksum: d90420bc00c871e4a955caa7095fad1de607ef31021370601cddf4d917c6f917aba13cb3ba4cb41d7228004a9a198d60f78fee44856cf8d21d82c7367b1eecec - languageName: node - linkType: hard - -"@walletconnect/utils@npm:^1.8.0": - version: 1.8.0 - resolution: "@walletconnect/utils@npm:1.8.0" - dependencies: - "@walletconnect/browser-utils": ^1.8.0 - "@walletconnect/encoding": ^1.0.1 - "@walletconnect/jsonrpc-utils": ^1.0.3 - "@walletconnect/types": ^1.8.0 - bn.js: 4.11.8 - js-sha3: 0.8.0 - query-string: 6.13.5 - checksum: 41b21fc6cb29c0714579dac8da988c14985fc0fcc0c5f02979e72509f42bf658e3ca8ea22ac4a50a9753d26b630d38a6b5fec84131a9eff0b78318b809b203dd - languageName: node - linkType: hard - -"@walletconnect/window-getters@npm:1.0.0, @walletconnect/window-getters@npm:^1.0.0": - version: 1.0.0 - resolution: "@walletconnect/window-getters@npm:1.0.0" - checksum: 192af7acb2051d304addb2e5a3f121fedd8c83ba6750018e3b0da5757bad525336bc5d9cb571f63b09828658764151da181337ec0e898811ad7f506910bd3b5f + query-string: 7.1.3 + uint8arrays: ^3.1.0 + checksum: 2ca91486ba8704ae73ee51ff5c76099cc85ceccb692434bed70bf16b75b371e71e66c9d888c1de92b15d7fa853eee549a85af1d97b275853b827d2b1d31814fe languageName: node linkType: hard @@ -3719,15 +3637,6 @@ __metadata: languageName: node linkType: hard -"@walletconnect/window-metadata@npm:1.0.0": - version: 1.0.0 - resolution: "@walletconnect/window-metadata@npm:1.0.0" - dependencies: - "@walletconnect/window-getters": ^1.0.0 - checksum: eec506ff6d35ae6e88db1e38b6f514f6cbf1a45b979878e5e50819d229b616fc645a2b0816145b61acda2701042160a4e0685f080927b87461853a62a887a9e9 - languageName: node - linkType: hard - "@walletconnect/window-metadata@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/window-metadata@npm:1.0.1" @@ -3738,35 +3647,25 @@ __metadata: languageName: node linkType: hard -"@web3modal/core@npm:2.1.1": - version: 2.1.1 - resolution: "@web3modal/core@npm:2.1.1" +"@web3modal/core@npm:2.4.7": + version: 2.4.7 + resolution: "@web3modal/core@npm:2.4.7" dependencies: buffer: 6.0.3 - valtio: 1.9.0 - checksum: a46502e6dc17771928462dcc64e17ac3179b219cb2ef5cd2d2ca9ed1806eb7cc0895437962884222e604c6421af8f537435e610e4dfcb21b53159eca5ac32410 + valtio: 1.10.5 + checksum: 3e4277a1b5ae57368ffcf8c3175fca1aff168e4a15b7bb4f70d54ce3d70457ba57fc5c66aedc426a99bc384370305c7e0731469f502de52ffb4616e9b2f39cda languageName: node linkType: hard -"@web3modal/standalone@npm:^2.1.1": - version: 2.1.1 - resolution: "@web3modal/standalone@npm:2.1.1" - dependencies: - "@web3modal/core": 2.1.1 - "@web3modal/ui": 2.1.1 - checksum: 2b5d2623baacb31ea1a897e89a9b4faccdb53ca11687789ca78b79062e3f133090d731ea63a68a7ab0c8b3951b5c7c3c203678ba158ccf4c463860e946bcde16 - languageName: node - linkType: hard - -"@web3modal/ui@npm:2.1.1": - version: 2.1.1 - resolution: "@web3modal/ui@npm:2.1.1" +"@web3modal/ui@npm:2.4.7": + version: 2.4.7 + resolution: "@web3modal/ui@npm:2.4.7" dependencies: - "@web3modal/core": 2.1.1 - lit: 2.6.1 - motion: 10.15.5 - qrcode: 1.5.1 - checksum: e32491dbaea598c8b7ec86af4aaf1adb0a4ecfd7d6726dbe859c128cf256d47cbfd06b615001f9d109e3c30ae63ecb644f6956a38c9cebac137c9a5bcd6d97dd + "@web3modal/core": 2.4.7 + lit: 2.7.5 + motion: 10.16.2 + qrcode: 1.5.3 + checksum: 143aee25170a87461668eda1f9326bc0d3683e95411e0bf184f3633a028b60927ea5ee313580c6648a87b28516252bf66e38532a7e0c65386a6ef37d6e8b6354 languageName: node linkType: hard @@ -4452,42 +4351,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.3.3": - version: 0.3.3 - resolution: "babel-plugin-polyfill-corejs2@npm:0.3.3" - dependencies: - "@babel/compat-data": ^7.17.7 - "@babel/helper-define-polyfill-provider": ^0.3.3 - semver: ^6.1.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7db3044993f3dddb3cc3d407bc82e640964a3bfe22de05d90e1f8f7a5cb71460011ab136d3c03c6c1ba428359ebf635688cd6205e28d0469bba221985f5c6179 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.6.0": - version: 0.6.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.6.0" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.3 - core-js-compat: ^3.25.1 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 470bb8c59f7c0912bd77fe1b5a2e72f349b3f65bbdee1d60d6eb7e1f4a085c6f24b2dd5ab4ac6c2df6444a96b070ef6790eccc9edb6a2668c60d33133bfb62c6 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.4.1": - version: 0.4.1 - resolution: "babel-plugin-polyfill-regenerator@npm:0.4.1" - dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.3 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ab0355efbad17d29492503230387679dfb780b63b25408990d2e4cf421012dae61d6199ddc309f4d2409ce4e9d3002d187702700dd8f4f8770ebbba651ed066c - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" @@ -4625,13 +4488,6 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:4.11.8": - version: 4.11.8 - resolution: "bn.js@npm:4.11.8" - checksum: 80d4709cd58a21f0be8201e9e5859fea5ef133318e9800c8454cd334625c6e1caea593ca21f9b9a085fb560fbc12fb2fb3514363f8604258db924237fd039139 - languageName: node - linkType: hard - "bn.js@npm:^4.11.0, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" @@ -4725,7 +4581,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.3, browserslist@npm:^4.21.4": +"browserslist@npm:^4.21.4": version: 4.21.4 resolution: "browserslist@npm:4.21.4" dependencies: @@ -4759,15 +4615,6 @@ __metadata: languageName: node linkType: hard -"btoa@npm:^1.2.1": - version: 1.2.1 - resolution: "btoa@npm:1.2.1" - bin: - btoa: bin/btoa.js - checksum: afbf004fb1b1d530e053ffa66ef5bd3878b101c59d808ac947fcff96810b4452abba2b54be687adadea2ba9efc7af48b04228742789bf824ef93f103767e690c - languageName: node - linkType: hard - "buffer-alloc-unsafe@npm:^1.1.0": version: 1.1.0 resolution: "buffer-alloc-unsafe@npm:1.1.0" @@ -4792,7 +4639,7 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.1": +"buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb @@ -4826,7 +4673,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.4.3, buffer@npm:^5.5.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -4981,21 +4828,6 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.7": - version: 4.3.7 - resolution: "chai@npm:4.3.7" - dependencies: - assertion-error: ^1.1.0 - check-error: ^1.0.2 - deep-eql: ^4.1.2 - get-func-name: ^2.0.0 - loupe: ^2.3.1 - pathval: ^1.1.1 - type-detect: ^4.0.5 - checksum: 0bba7d267848015246a66995f044ce3f0ebc35e530da3cbdf171db744e14cbe301ab913a8d07caf7952b430257ccbb1a4a983c570a7c5748dc537897e5131f7c - languageName: node - linkType: hard - "chalk@npm:4.1.2, chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -5204,13 +5036,6 @@ __metadata: languageName: node linkType: hard -"clone@npm:^2.1.1": - version: 2.1.2 - resolution: "clone@npm:2.1.2" - checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d - languageName: node - linkType: hard - "clsx@npm:1.1.1": version: 1.1.1 resolution: "clsx@npm:1.1.1" @@ -5417,12 +5242,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.25.1": - version: 3.25.3 - resolution: "core-js-compat@npm:3.25.3" +"copy-to-clipboard@npm:^3.3.3": + version: 3.3.3 + resolution: "copy-to-clipboard@npm:3.3.3" dependencies: - browserslist: ^4.21.4 - checksum: f35f4f706695e542bf8bb35cff9b5865105a8c5c012409d703852ad7c9c43ace2371ec8b56d9f6629760dbb4a49529553e57eca5308522cbeedb44b97be8a2db + toggle-selection: ^1.0.6 + checksum: e0a325e39b7615108e6c1c8ac110ae7b829cdc4ee3278b1df6a0e4228c490442cc86444cd643e2da344fbc424b3aab8909e2fec82f8bc75e7e5b190b7c24eecf languageName: node linkType: hard @@ -5666,6 +5491,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 + languageName: node + linkType: hard + "deep-eql@npm:^3.0.1": version: 3.0.1 resolution: "deep-eql@npm:3.0.1" @@ -5684,15 +5516,6 @@ __metadata: languageName: node linkType: hard -"deep-eql@npm:^4.1.2": - version: 4.1.3 - resolution: "deep-eql@npm:4.1.3" - dependencies: - type-detect: ^4.0.0 - checksum: 7f6d30cb41c713973dc07eaadded848b2ab0b835e518a88b91bea72f34e08c4c71d167a722a6f302d3a6108f05afd8e6d7650689a84d5d29ec7fe6220420397f - languageName: node - linkType: hard - "deep-extend@npm:~0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -5780,14 +5603,7 @@ __metadata: languageName: node linkType: hard -"detect-browser@npm:5.2.0": - version: 5.2.0 - resolution: "detect-browser@npm:5.2.0" - checksum: 63b5c38fecc657ff12de01a41e6c8c97b3d610dffa37aef1983ec5bfb4314687d588c0c44c5ee03bd45ef15b7fe465bce9349c373369e6a7405f318e0aae56f9 - languageName: node - linkType: hard - -"detect-browser@npm:5.3.0": +"detect-browser@npm:5.3.0, detect-browser@npm:^5.3.0": version: 5.3.0 resolution: "detect-browser@npm:5.3.0" checksum: dd6e08d55da1d9e0f22510ac79872078ae03d9dfa13c5e66c96baedc1c86567345a88f96949161f6be8f3e0fafa93bf179bdb1cd311b14f5f163112fcc70ab49 @@ -6860,17 +6676,15 @@ __metadata: languageName: node linkType: hard -"eth-block-tracker@npm:4.4.3": - version: 4.4.3 - resolution: "eth-block-tracker@npm:4.4.3" +"eth-block-tracker@npm:6.1.0": + version: 6.1.0 + resolution: "eth-block-tracker@npm:6.1.0" dependencies: - "@babel/plugin-transform-runtime": ^7.5.5 - "@babel/runtime": ^7.5.5 - eth-query: ^2.1.0 + "@metamask/safe-event-emitter": ^2.0.0 + "@metamask/utils": ^3.0.1 json-rpc-random-id: ^1.0.1 pify: ^3.0.0 - safe-event-emitter: ^1.0.1 - checksum: 3ae7e459b19b65303ec7bd0df7ad2a69476adb01cf2f44699b3482fd14e9e058e9eb85a9612307ba33f565e29ca6d19466765122a1106d1def820f6bfe272d52 + checksum: 33ee6375a26822649d1e9ac24a3c39d70338eb505715f72b9102fb82e40d7a48902b4a7dd4a33bb4f121b79707c5ab045777507a2881cfcdb385c8ccbb3ac2a0 languageName: node linkType: hard @@ -6902,40 +6716,20 @@ __metadata: languageName: node linkType: hard -"eth-json-rpc-filters@npm:4.2.2": - version: 4.2.2 - resolution: "eth-json-rpc-filters@npm:4.2.2" +"eth-json-rpc-filters@npm:5.1.0": + version: 5.1.0 + resolution: "eth-json-rpc-filters@npm:5.1.0" dependencies: "@metamask/safe-event-emitter": ^2.0.0 async-mutex: ^0.2.6 - eth-json-rpc-middleware: ^6.0.0 eth-query: ^2.1.2 json-rpc-engine: ^6.1.0 pify: ^5.0.0 - checksum: add6ef65c30c6dc85f9ab464325b509247b1be2596763d30cc23c66d32e0a835830daf14bc36fc2e43670d0c54b4a6010bb981c9006372c5520fd6abdf0d6c77 - languageName: node - linkType: hard - -"eth-json-rpc-middleware@npm:^6.0.0": - version: 6.0.0 - resolution: "eth-json-rpc-middleware@npm:6.0.0" - dependencies: - btoa: ^1.2.1 - clone: ^2.1.1 - eth-query: ^2.1.2 - eth-rpc-errors: ^3.0.0 - eth-sig-util: ^1.4.2 - ethereumjs-util: ^5.1.2 - json-rpc-engine: ^5.3.0 - json-stable-stringify: ^1.0.1 - node-fetch: ^2.6.1 - pify: ^3.0.0 - safe-event-emitter: ^1.0.1 - checksum: d4ef8c6ba85cc0060c09ded79152d46cdd1a85124c655f40bb8ca72a4b52dfe7ef101b45dae1ac04558900ccb10b98e5c9570be22715a7dc158e822728e159b5 + checksum: 864092e96277953c399a139df66572b864bd41247c5c1d18e6529973804d4fd8962658d8b10571152554802fa8daaa1003588aee79ffce754e0bc57c39b771d5 languageName: node linkType: hard -"eth-query@npm:^2.1.0, eth-query@npm:^2.1.2": +"eth-query@npm:^2.1.2": version: 2.1.2 resolution: "eth-query@npm:2.1.2" dependencies: @@ -6954,15 +6748,6 @@ __metadata: languageName: node linkType: hard -"eth-rpc-errors@npm:^3.0.0": - version: 3.0.0 - resolution: "eth-rpc-errors@npm:3.0.0" - dependencies: - fast-safe-stringify: ^2.0.6 - checksum: c14db72bd28e8545ce8d6bbe22fa092b11695cfedc22632eda875324354edac813742c097cf56e214bd3adc14c8b1160a7b8ee371c93126e5abbb55ca75671eb - languageName: node - linkType: hard - "eth-rpc-errors@npm:^4.0.2": version: 4.0.3 resolution: "eth-rpc-errors@npm:4.0.3" @@ -6972,16 +6757,6 @@ __metadata: languageName: node linkType: hard -"eth-sig-util@npm:^1.4.2": - version: 1.4.2 - resolution: "eth-sig-util@npm:1.4.2" - dependencies: - ethereumjs-abi: "git+https://github.com/ethereumjs/ethereumjs-abi.git" - ethereumjs-util: ^5.1.1 - checksum: 578f5c571c1bb0a86dc1bd4a5b56b8073b37823496d7afa74d772cf91ae6860f91bafcbee931be39a3d13f0c195df9f026a27fce350605ad5d15901a5a4ea94a - languageName: node - linkType: hard - "ethereum-bloom-filters@npm:^1.0.6": version: 1.0.10 resolution: "ethereum-bloom-filters@npm:1.0.10" @@ -7026,16 +6801,6 @@ __metadata: languageName: node linkType: hard -"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": - version: 0.6.8 - resolution: "ethereumjs-abi@https://github.com/ethereumjs/ethereumjs-abi.git#commit=ee3994657fa7a427238e6ba92a84d0b529bbcde0" - dependencies: - bn.js: ^4.11.8 - ethereumjs-util: ^6.0.0 - checksum: ae074be0bb012857ab5d3ae644d1163b908a48dd724b7d2567cfde309dc72222d460438f2411936a70dc949dc604ce1ef7118f7273bd525815579143c907e336 - languageName: node - linkType: hard - "ethereumjs-abi@npm:^0.6.8": version: 0.6.8 resolution: "ethereumjs-abi@npm:0.6.8" @@ -7046,21 +6811,6 @@ __metadata: languageName: node linkType: hard -"ethereumjs-util@npm:^5.1.1, ethereumjs-util@npm:^5.1.2": - version: 5.2.1 - resolution: "ethereumjs-util@npm:5.2.1" - dependencies: - bn.js: ^4.11.0 - create-hash: ^1.1.2 - elliptic: ^6.5.2 - ethereum-cryptography: ^0.1.3 - ethjs-util: ^0.1.3 - rlp: ^2.0.0 - safe-buffer: ^5.1.1 - checksum: 20db6c639d92b35739fd5f7a71e64a92e85442ea0d176b59b5cd5828265b6cf42bd4868cf81a9b20a83738db1ffa7a2f778f1d850d663627a1a5209f7904b44f - languageName: node - linkType: hard - "ethereumjs-util@npm:^6.0.0, ethereumjs-util@npm:^6.2.1": version: 6.2.1 resolution: "ethereumjs-util@npm:6.2.1" @@ -7192,7 +6942,7 @@ __metadata: languageName: node linkType: hard -"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.3, ethjs-util@npm:^0.1.6": +"ethjs-util@npm:0.1.6, ethjs-util@npm:^0.1.6": version: 0.1.6 resolution: "ethjs-util@npm:0.1.6" dependencies: @@ -7209,14 +6959,14 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:4.0.7, eventemitter3@npm:^4.0.7": +"eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 languageName: node linkType: hard -"events@npm:^3.0.0, events@npm:^3.3.0": +"events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 @@ -8898,13 +8648,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:^2.0.1": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a - languageName: node - linkType: hard - "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -9061,16 +8804,6 @@ __metadata: languageName: node linkType: hard -"json-rpc-engine@npm:^5.3.0": - version: 5.4.0 - resolution: "json-rpc-engine@npm:5.4.0" - dependencies: - eth-rpc-errors: ^3.0.0 - safe-event-emitter: ^1.0.1 - checksum: 310af9dc256a14e3695f917912046afcab1fe716d6243616702bc2ebcbc7d164e3c2c04a5ff267e3930ef451e4cd8905651b656988bceb96a7034bf144eb8e67 - languageName: node - linkType: hard - "json-rpc-random-id@npm:^1.0.0, json-rpc-random-id@npm:^1.0.1": version: 1.0.1 resolution: "json-rpc-random-id@npm:1.0.1" @@ -9116,15 +8849,6 @@ __metadata: languageName: node linkType: hard -"json-stable-stringify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify@npm:1.0.1" - dependencies: - jsonify: ~0.0.0 - checksum: 65d6cbf0fca72a4136999f65f4401cf39a129f7aeff0fdd987ac3d3423a2113659294045fb8377e6e20d865cac32b1b8d70f3d87346c9786adcee60661d96ca5 - languageName: node - linkType: hard - "json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -9180,13 +8904,6 @@ __metadata: languageName: node linkType: hard -"jsonify@npm:~0.0.0": - version: 0.0.0 - resolution: "jsonify@npm:0.0.0" - checksum: d8d4ed476c116e6987a460dcb82f22284686caae9f498ac87b0502c1765ac1522f4f450a4cad4cc368d202fd3b27a3860735140a82867fc6d558f5f199c38bce - languageName: node - linkType: hard - "jsonparse@npm:^1.2.0": version: 1.3.1 resolution: "jsonparse@npm:1.3.1" @@ -9382,33 +9099,34 @@ __metadata: languageName: node linkType: hard -"lit-element@npm:^3.2.0": - version: 3.2.2 - resolution: "lit-element@npm:3.2.2" +"lit-element@npm:^3.3.0": + version: 3.3.2 + resolution: "lit-element@npm:3.3.2" dependencies: + "@lit-labs/ssr-dom-shim": ^1.1.0 "@lit/reactive-element": ^1.3.0 - lit-html: ^2.2.0 - checksum: e1df57c02ad5ae4c42b49a5066b3b623bccf7fa6610bbc3f65bc22cbbe1546ecd6a7f717b1f01863929262f416c4b8b7a39ff166114215f93cc22f4e5b3825c3 + lit-html: ^2.7.0 + checksum: afe50825be05a8c83be418432dfed2f9a84ca1c6c1d1807e2090def9f94cc403dcbf832b338cdfe39cd168518664c02a6c7392868ca323e356e5744e3b4f45e6 languageName: node linkType: hard -"lit-html@npm:^2.2.0, lit-html@npm:^2.6.0": - version: 2.6.1 - resolution: "lit-html@npm:2.6.1" +"lit-html@npm:^2.7.0": + version: 2.7.4 + resolution: "lit-html@npm:2.7.4" dependencies: "@types/trusted-types": ^2.0.2 - checksum: 32291eb5bcaa7fcc1d433522a9a62c3c3d240e49bb8c57ccea5c10014823d94f62f17e2d5361781cb6ee0b3c9078ef839de6164d5374371d650471904515e48e + checksum: 3809d62d8b8e66c047a582fe62d430384c63af8c8444da4ca565b41d03e0295be2ce3eaa3c03b58d35a5d74fd8c98976585902204fc28006cfb9adf29fc1761e languageName: node linkType: hard -"lit@npm:2.6.1": - version: 2.6.1 - resolution: "lit@npm:2.6.1" +"lit@npm:2.7.5": + version: 2.7.5 + resolution: "lit@npm:2.7.5" dependencies: "@lit/reactive-element": ^1.6.0 - lit-element: ^3.2.0 - lit-html: ^2.6.0 - checksum: 74f2813152a48f195784f01b6b4ff7e4e7d8fa90ac272b725d1953fa3e1d6c9dca60b77da435f34144fcdd38705480889a8ea986835676932a8559c897cea517 + lit-element: ^3.3.0 + lit-html: ^2.7.0 + checksum: 61a3f87c57136618f47a30b36cdfb592fcba42dcfbdb104d2b5ca291148c2d9a32fcb713bb91090bd08d6897a00e73f8425da6e3626aa080eaf410a32397ae69 languageName: node linkType: hard @@ -9457,13 +9175,6 @@ __metadata: languageName: node linkType: hard -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: a3f527d22c548f43ae31c861ada88b2637eb48ac6aa3eb56e82d44917971b8aa96fbb37aa60efea674dc4ee8c42074f90f7b1f772e9db375435f6c83a19b3bc6 - languageName: node - linkType: hard - "lodash.isequal@npm:4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" @@ -9970,38 +9681,6 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.2.0": - version: 10.2.0 - resolution: "mocha@npm:10.2.0" - dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 406c45eab122ffd6ea2003c2f108b2bc35ba036225eee78e0c784b6fa2c7f34e2b13f1dbacef55a4fdf523255d76e4f22d1b5aacda2394bd11666febec17c719 - languageName: node - linkType: hard - "mocha@npm:^7.1.1": version: 7.2.0 resolution: "mocha@npm:7.2.0" @@ -10044,17 +9723,17 @@ __metadata: languageName: node linkType: hard -"motion@npm:10.15.5": - version: 10.15.5 - resolution: "motion@npm:10.15.5" +"motion@npm:10.16.2": + version: 10.16.2 + resolution: "motion@npm:10.16.2" dependencies: "@motionone/animation": ^10.15.1 - "@motionone/dom": ^10.15.5 - "@motionone/svelte": ^10.15.5 + "@motionone/dom": ^10.16.2 + "@motionone/svelte": ^10.16.2 "@motionone/types": ^10.15.1 "@motionone/utils": ^10.15.1 - "@motionone/vue": ^10.15.5 - checksum: 43e7883d95da6e4949b2e5ca01732bce28214f4978bf940511a3fbd8e00943ab7c00fcb28f3f1ce1ed099a404016f784243330be161c4805958deaf60d1b0571 + "@motionone/vue": ^10.16.2 + checksum: 0b91256808c2374d8b7f4ac5e7ed513f2ca8df2b7d1be4fbc00ec5baece5162ada648aedaa5bc1d60be9ad2e6c9bc1d3bb160333051c20ab79e241b8e02e3c92 languageName: node linkType: hard @@ -10276,7 +9955,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2, node-fetch@npm:2.6.7, node-fetch@npm:^2.6.1": +"node-fetch@npm:2, node-fetch@npm:2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" dependencies: @@ -10963,13 +10642,6 @@ __metadata: languageName: node linkType: hard -"pngjs@npm:^3.3.0": - version: 3.4.0 - resolution: "pngjs@npm:3.4.0" - checksum: 8bd40bd698abd16b72c97b85cb858c80894fbedc76277ce72a784aa441e14795d45d9856e97333ca469b34b67528860ffc8a7317ca6beea349b645366df00bcd - languageName: node - linkType: hard - "pngjs@npm:^5.0.0": version: 5.0.0 resolution: "pngjs@npm:5.0.0" @@ -11069,10 +10741,10 @@ __metadata: languageName: node linkType: hard -"preact@npm:10.4.1": - version: 10.4.1 - resolution: "preact@npm:10.4.1" - checksum: e8c5eae6dca469226177394cf49994d6beab5b9b10d31e000d8b16d9b00bfa52cdd10b41331759d68646e7b8f601430d78eb025f9026263adc90150699800ed3 +"preact@npm:^10.12.0": + version: 10.15.1 + resolution: "preact@npm:10.15.1" + checksum: dabad11843b19b40b11846a25ff0b1fc4bc58268909e01a7faddb341a40983d24fbe7d44ad6e2c5d35e43091963af616800552fec9af44dd0a2f0f698d1bba1f languageName: node linkType: hard @@ -11191,10 +10863,10 @@ __metadata: languageName: node linkType: hard -"proxy-compare@npm:2.4.0": - version: 2.4.0 - resolution: "proxy-compare@npm:2.4.0" - checksum: ff8952db96980ad7123a1368aa6fed6b1eb390c22758152805bb5e1d4511fb50e798c19deb93feaa3b22f103a758c38d265ae34e4769d4e1748ee59795dfa6b2 +"proxy-compare@npm:2.5.1": + version: 2.5.1 + resolution: "proxy-compare@npm:2.5.1" + checksum: c7cc151ac255150bcb24becde6495b3e399416c31991af377ce082255b51f07eaeb5d861bf8bf482703e92f88b90a5892ad57d3153ea29450d03ef921683d9fa languageName: node linkType: hard @@ -11239,26 +10911,23 @@ __metadata: languageName: node linkType: hard -"qrcode@npm:1.4.4": - version: 1.4.4 - resolution: "qrcode@npm:1.4.4" +"qrcode@npm:1.5.0": + version: 1.5.0 + resolution: "qrcode@npm:1.5.0" dependencies: - buffer: ^5.4.3 - buffer-alloc: ^1.2.0 - buffer-from: ^1.1.1 dijkstrajs: ^1.0.1 - isarray: ^2.0.1 - pngjs: ^3.3.0 - yargs: ^13.2.4 + encode-utf8: ^1.0.3 + pngjs: ^5.0.0 + yargs: ^15.3.1 bin: - qrcode: ./bin/qrcode - checksum: 8c1a7ee3092c0ed60f0413594af879ac6dffb897d4921144a8e7ae3dce40c04ba6457ab21664ca43934ba3fe19cced85abaf0b87b07916239d7254d4bb4fcf13 + qrcode: bin/qrcode + checksum: a0857713d4390937900a2789d5a065700f7cf78cd760e773bf8524c0e907ff629db19c9bdd4210aac55b8eef53ec1c7bcaa2acf01f340ef049c53098388a45a0 languageName: node linkType: hard -"qrcode@npm:1.5.0": - version: 1.5.0 - resolution: "qrcode@npm:1.5.0" +"qrcode@npm:1.5.3": + version: 1.5.3 + resolution: "qrcode@npm:1.5.3" dependencies: dijkstrajs: ^1.0.1 encode-utf8: ^1.0.3 @@ -11266,11 +10935,11 @@ __metadata: yargs: ^15.3.1 bin: qrcode: bin/qrcode - checksum: a0857713d4390937900a2789d5a065700f7cf78cd760e773bf8524c0e907ff629db19c9bdd4210aac55b8eef53ec1c7bcaa2acf01f340ef049c53098388a45a0 + checksum: 9a8a20a0a9cb1d15de8e7b3ffa214e8b6d2a8b07655f25bd1b1d77f4681488f84d7bae569870c0652872d829d5f8ac4922c27a6bd14c13f0e197bf07b28dead7 languageName: node linkType: hard -"qrcode@npm:1.5.1, qrcode@npm:^1.5.1": +"qrcode@npm:^1.5.1": version: 1.5.1 resolution: "qrcode@npm:1.5.1" dependencies: @@ -11300,26 +10969,27 @@ __metadata: languageName: node linkType: hard -"query-string@npm:6.13.5": - version: 6.13.5 - resolution: "query-string@npm:6.13.5" +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" dependencies: - decode-uri-component: ^0.2.0 + decode-uri-component: ^0.2.2 + filter-obj: ^1.1.0 split-on-first: ^1.0.0 strict-uri-encode: ^2.0.0 - checksum: 1019dea0ab277bdf606bcc022ec223a9ab9947608d2696114ef9198f72ae553be039705d6c52e16af43d9b79bac67385f63fb7fe9241cd2f7b703dd23c7ab8d3 + checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 languageName: node linkType: hard -"query-string@npm:7.1.1": - version: 7.1.1 - resolution: "query-string@npm:7.1.1" +"query-string@npm:^6.13.5": + version: 6.14.1 + resolution: "query-string@npm:6.14.1" dependencies: decode-uri-component: ^0.2.0 filter-obj: ^1.1.0 split-on-first: ^1.0.0 strict-uri-encode: ^2.0.0 - checksum: b227d1f588ae93f9f0ad078c6b811295fa151dc5a160a03bb2bac5fa0e6919cb1daa570aad1d288e77c8e89fde5362ba505b1014e6e793da9b1e885b59a690a6 + checksum: f2c7347578fa0f3fd4eaace506470cb4e9dc52d409a7ddbd613f614b9a594d750877e193b5d5e843c7477b3b295b857ec328903c943957adc41a3efb6c929449 languageName: node linkType: hard @@ -11766,7 +11436,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1": +"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.20.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -11808,7 +11478,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" dependencies: @@ -11897,7 +11567,7 @@ __metadata: languageName: node linkType: hard -"rlp@npm:^2.0.0, rlp@npm:^2.2.3, rlp@npm:^2.2.4": +"rlp@npm:^2.2.3, rlp@npm:^2.2.4": version: 2.2.7 resolution: "rlp@npm:2.2.7" dependencies: @@ -11984,15 +11654,6 @@ __metadata: languageName: node linkType: hard -"safe-event-emitter@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-event-emitter@npm:1.0.1" - dependencies: - events: ^3.0.0 - checksum: 2a15094bd28b0966571693f219b5a846949ae24f7ba87c6024f0ed552bef63ebe72970a784b85b77b1f03f1c95e78fabe19306d44538dbc4a3a685bed31c18c4 - languageName: node - linkType: hard - "safe-json-utils@npm:^1.1.1": version: 1.1.1 resolution: "safe-json-utils@npm:1.1.1" @@ -12111,7 +11772,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": +"semver@npm:^6.0.0, semver@npm:^6.3.0": version: 6.3.0 resolution: "semver@npm:6.3.0" bin: @@ -12131,6 +11792,17 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.3.8": + version: 7.5.2 + resolution: "semver@npm:7.5.2" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 3fdf5d1e6f170fe8bcc41669e31787649af91af7f54f05c71d0865bb7aa27e8b92f68b3e6b582483e2c1c648008bc84249d2cd86301771fe5cbf7621d1fe5375 + languageName: node + linkType: hard + "serialize-javascript@npm:6.0.0": version: 6.0.0 resolution: "serialize-javascript@npm:6.0.0" @@ -12758,6 +12430,13 @@ __metadata: languageName: node linkType: hard +"superstruct@npm:^1.0.3": + version: 1.0.3 + resolution: "superstruct@npm:1.0.3" + checksum: 761790bb111e6e21ddd608299c252f3be35df543263a7ebbc004e840d01fcf8046794c274bcb351bdf3eae4600f79d317d085cdbb19ca05803a4361840cc9bb1 + languageName: node + linkType: hard + "supports-color@npm:6.0.0": version: 6.0.0 resolution: "supports-color@npm:6.0.0" @@ -13438,16 +13117,7 @@ __metadata: languageName: node linkType: hard -"uint8arrays@npm:3.1.0": - version: 3.1.0 - resolution: "uint8arrays@npm:3.1.0" - dependencies: - multiformats: ^9.4.2 - checksum: 77fe0c8644417a849f5cfc0e5a5308c65e3b779a56f816dd27b8f60f7fac1ac7626f57c9abacec77d147beb5da8401b86438b1591d93cae7f7511a3211cc01b3 - languageName: node - linkType: hard - -"uint8arrays@npm:^3.0.0": +"uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": version: 3.1.1 resolution: "uint8arrays@npm:3.1.1" dependencies: @@ -13676,18 +13346,18 @@ __metadata: languageName: node linkType: hard -"valtio@npm:1.9.0": - version: 1.9.0 - resolution: "valtio@npm:1.9.0" +"valtio@npm:1.10.5": + version: 1.10.5 + resolution: "valtio@npm:1.10.5" dependencies: - proxy-compare: 2.4.0 + proxy-compare: 2.5.1 use-sync-external-store: 1.2.0 peerDependencies: react: ">=16.8" peerDependenciesMeta: react: optional: true - checksum: baf07b9130d6fc27b542b0a06a02a788c3cf85bbe4709a765655ac4a66ade016681ff368e0434aceb98925c80747928530842a939f23a1f916b3f81c2b2a1a65 + checksum: a01d7cca44b3ff60213aa40470c42083f7522d8e2c2f2d9f696b0aa3eec4c3dba7393831d5ff47db1ad025904860d2788ce4d9654963ff3555481deb25376851 languageName: node linkType: hard @@ -13723,14 +13393,14 @@ __metadata: languageName: node linkType: hard -"wagmi@npm:^0.11.6": - version: 0.11.6 - resolution: "wagmi@npm:0.11.6" +"wagmi@npm:^0.12.15": + version: 0.12.16 + resolution: "wagmi@npm:0.12.16" dependencies: - "@tanstack/query-sync-storage-persister": ^4.14.5 - "@tanstack/react-query": ^4.14.5 - "@tanstack/react-query-persist-client": ^4.14.5 - "@wagmi/core": 0.9.6 + "@tanstack/query-sync-storage-persister": ^4.27.1 + "@tanstack/react-query": ^4.28.0 + "@tanstack/react-query-persist-client": ^4.28.0 + "@wagmi/core": 0.10.14 abitype: ^0.3.0 use-sync-external-store: ^1.2.0 peerDependencies: @@ -13740,7 +13410,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 98f1227650bcc7a92184da2b8b7adfb91b60d1135a41597e13f929aecbe698b54af076d8b532c0d4599cf3e5e57b2d39ce4c9b998e8f7a48042f09afdcb48aab + checksum: b20bbe5271e9088509ced5831b2cef6ac4f9ea9b8ecdc9164fac5a97089771c03946485c7915e9125193f4c79831a9a2deb20a9294e3921a64098716584b1730 languageName: node linkType: hard @@ -13943,21 +13613,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:7.5.3": - version: 7.5.3 - resolution: "ws@npm:7.5.3" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 423dc0d859fa74020f5555140905b862470a60ea1567bb9ad55a087263d7718b9c94f69678be1cee9868925c570f1e6fc79d09f90c39057bc63fa2edbb2c547b - languageName: node - linkType: hard - "ws@npm:^7.4.0, ws@npm:^7.4.5, ws@npm:^7.4.6, ws@npm:^7.5.1": version: 7.5.9 resolution: "ws@npm:7.5.9" @@ -14101,7 +13756,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:13.3.2, yargs@npm:^13.2.4, yargs@npm:^13.3.0": +"yargs@npm:13.3.2, yargs@npm:^13.3.0": version: 13.3.2 resolution: "yargs@npm:13.3.2" dependencies: From 656a8c22a266d21f047693e8b1eeaa3ee9970522 Mon Sep 17 00:00:00 2001 From: port <108868128+portdeveloper@users.noreply.github.com> Date: Mon, 3 Jul 2023 21:28:30 +0300 Subject: [PATCH 3/7] Change scaffoldEthDark secondary color (#399) from #2A3655 to #323f61 --- packages/nextjs/tailwind.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/tailwind.config.js b/packages/nextjs/tailwind.config.js index a95fb38db..925c88f40 100644 --- a/packages/nextjs/tailwind.config.js +++ b/packages/nextjs/tailwind.config.js @@ -36,7 +36,7 @@ module.exports = { scaffoldEthDark: { primary: "#212638", "primary-content": "#F9FBFF", - secondary: "#2A3655", + secondary: "#323f61", "secondary-content": "#F9FBFF", accent: "#4969A6", "accent-content": "#F9FBFF", From 9262e6d5b22d03928d22f0c7f025029f77e34aeb Mon Sep 17 00:00:00 2001 From: port <108868128+portdeveloper@users.noreply.github.com> Date: Wed, 5 Jul 2023 13:46:48 +0300 Subject: [PATCH 4/7] Fix/solidity formatting (#407) * Override .sol formatting in hardhat/.prettierrc * Format YourContract.sol using new settings --- packages/hardhat/.prettierrc.json | 23 +++- packages/hardhat/contracts/YourContract.sol | 117 +++++++++++--------- 2 files changed, 81 insertions(+), 59 deletions(-) diff --git a/packages/hardhat/.prettierrc.json b/packages/hardhat/.prettierrc.json index 4492a77cc..8b9b8b776 100644 --- a/packages/hardhat/.prettierrc.json +++ b/packages/hardhat/.prettierrc.json @@ -1,6 +1,19 @@ { - "arrowParens": "avoid", - "printWidth": 120, - "tabWidth": 2, - "trailingComma": "all" - } + "arrowParens": "avoid", + "printWidth": 120, + "tabWidth": 2, + "trailingComma": "all", + "overrides": [ + { + "files": "*.sol", + "options": { + "printWidth": 80, + "tabWidth": 4, + "useTabs": true, + "singleQuote": false, + "bracketSpacing": true, + "explicitTypes": "always" + } + } + ] +} diff --git a/packages/hardhat/contracts/YourContract.sol b/packages/hardhat/contracts/YourContract.sol index 5cd615836..7f1a1cda0 100644 --- a/packages/hardhat/contracts/YourContract.sol +++ b/packages/hardhat/contracts/YourContract.sol @@ -3,6 +3,7 @@ pragma solidity >=0.8.0 <0.9.0; // Useful for debugging. Remove when deploying to a live network. import "hardhat/console.sol"; + // Use openzeppelin to inherit battle-tested implementations (ERC20, ERC721, etc) // import "@openzeppelin/contracts/access/Ownable.sol"; @@ -12,67 +13,75 @@ import "hardhat/console.sol"; * @author BuidlGuidl */ contract YourContract { + // State Variables + address public immutable owner; + string public greeting = "Building Unstoppable Apps!!!"; + bool public premium = false; + uint256 public totalCounter = 0; + mapping(address => uint) public userGreetingCounter; - // State Variables - address public immutable owner; - string public greeting = "Building Unstoppable Apps!!!"; - bool public premium = false; - uint256 public totalCounter = 0; - mapping(address => uint) public userGreetingCounter; - - // Events: a way to emit log statements from smart contract that can be listened to by external parties - event GreetingChange(address indexed greetingSetter, string newGreeting, bool premium, uint256 value); + // Events: a way to emit log statements from smart contract that can be listened to by external parties + event GreetingChange( + address indexed greetingSetter, + string newGreeting, + bool premium, + uint256 value + ); - // Constructor: Called once on contract deployment - // Check packages/hardhat/deploy/00_deploy_your_contract.ts - constructor(address _owner) { - owner = _owner; - } + // Constructor: Called once on contract deployment + // Check packages/hardhat/deploy/00_deploy_your_contract.ts + constructor(address _owner) { + owner = _owner; + } - // Modifier: used to define a set of rules that must be met before or after a function is executed - // Check the withdraw() function - modifier isOwner() { - // msg.sender: predefined variable that represents address of the account that called the current function - require(msg.sender == owner, "Not the Owner"); - _; - } + // Modifier: used to define a set of rules that must be met before or after a function is executed + // Check the withdraw() function + modifier isOwner() { + // msg.sender: predefined variable that represents address of the account that called the current function + require(msg.sender == owner, "Not the Owner"); + _; + } - /** - * Function that allows anyone to change the state variable "greeting" of the contract and increase the counters - * - * @param _newGreeting (string memory) - new greeting to save on the contract - */ - function setGreeting(string memory _newGreeting) public payable { - // Print data to the hardhat chain console. Remove when deploying to a live network. - console.log("Setting new greeting '%s' from %s", _newGreeting, msg.sender); + /** + * Function that allows anyone to change the state variable "greeting" of the contract and increase the counters + * + * @param _newGreeting (string memory) - new greeting to save on the contract + */ + function setGreeting(string memory _newGreeting) public payable { + // Print data to the hardhat chain console. Remove when deploying to a live network. + console.log( + "Setting new greeting '%s' from %s", + _newGreeting, + msg.sender + ); - // Change state variables - greeting = _newGreeting; - totalCounter += 1; - userGreetingCounter[msg.sender] += 1; + // Change state variables + greeting = _newGreeting; + totalCounter += 1; + userGreetingCounter[msg.sender] += 1; - // msg.value: built-in global variable that represents the amount of ether sent with the transaction - if (msg.value > 0) { - premium = true; - } else { - premium = false; - } + // msg.value: built-in global variable that represents the amount of ether sent with the transaction + if (msg.value > 0) { + premium = true; + } else { + premium = false; + } - // emit: keyword used to trigger an event - emit GreetingChange(msg.sender, _newGreeting, msg.value > 0, 0); - } + // emit: keyword used to trigger an event + emit GreetingChange(msg.sender, _newGreeting, msg.value > 0, 0); + } - /** - * Function that allows the owner to withdraw all the Ether in the contract - * The function can only be called by the owner of the contract as defined by the isOwner modifier - */ - function withdraw() isOwner public { - (bool success,) = owner.call{value: address(this).balance}(""); - require(success, "Failed to send Ether"); - } + /** + * Function that allows the owner to withdraw all the Ether in the contract + * The function can only be called by the owner of the contract as defined by the isOwner modifier + */ + function withdraw() public isOwner { + (bool success, ) = owner.call{ value: address(this).balance }(""); + require(success, "Failed to send Ether"); + } - /** - * Function that allows the contract to receive ETH - */ - receive() external payable {} + /** + * Function that allows the contract to receive ETH + */ + receive() external payable {} } From 7d3e47b10889fab140e893653b56938122d1da3f Mon Sep 17 00:00:00 2001 From: "Shiv Bhonde | shivbhonde.eth" Date: Wed, 5 Jul 2023 13:33:22 +0200 Subject: [PATCH 5/7] Migration to wagmi v1 and viem (#352) Co-authored-by: Samuel --- README.md | 11 +- .../blockexplorer/AddressLogsTab.tsx | 6 +- .../blockexplorer/AddressStorageTab.tsx | 14 +- .../components/blockexplorer/SearchBar.tsx | 15 +- .../blockexplorer/TransactionsTable.tsx | 14 +- .../components/example-ui/ContractData.tsx | 9 +- .../components/scaffold-eth/Address.tsx | 9 +- .../scaffold-eth/Contract/ContractInput.tsx | 8 +- .../Contract/ContractReadMethods.tsx | 29 + .../scaffold-eth/Contract/ContractUI.tsx | 52 +- .../Contract/ContractVariables.tsx | 40 ++ .../Contract/ContractWriteMethods.tsx | 39 ++ .../scaffold-eth/Contract/DisplayVariable.tsx | 25 +- .../Contract/ReadOnlyFunctionForm.tsx | 38 +- .../scaffold-eth/Contract/TxReceipt.tsx | 5 +- .../Contract/WriteOnlyFunctionForm.tsx | 70 +-- .../scaffold-eth/Contract/utilsContract.tsx | 183 +----- .../scaffold-eth/Contract/utilsDisplay.tsx | 34 +- .../nextjs/components/scaffold-eth/Faucet.tsx | 45 +- .../components/scaffold-eth/FaucetButton.tsx | 21 +- .../scaffold-eth/Input/AddressInput.tsx | 13 +- .../scaffold-eth/Input/Bytes32Input.tsx | 8 +- .../scaffold-eth/Input/BytesInput.tsx | 8 +- .../scaffold-eth/Input/InputBase.tsx | 2 +- .../scaffold-eth/Input/IntegerInput.tsx | 8 +- .../components/scaffold-eth/Input/utils.ts | 14 +- .../hooks/scaffold-eth/useAutoConnect.ts | 2 +- .../hooks/scaffold-eth/useBurnerWallet.ts | 98 ++-- .../hooks/scaffold-eth/useContractLogs.ts | 41 +- .../scaffold-eth/useDeployedContractInfo.ts | 10 +- .../hooks/scaffold-eth/useFetchBlocks.ts | 57 +- .../scaffold-eth/useNativeCurrencyPrice.ts | 8 +- .../hooks/scaffold-eth/useScaffoldContract.ts | 27 +- .../scaffold-eth/useScaffoldContractWrite.ts | 46 +- .../scaffold-eth/useScaffoldEventHistory.ts | 86 +-- .../useScaffoldEventSubscriber.ts | 19 +- .../hooks/scaffold-eth/useTransactor.tsx | 63 ++- packages/nextjs/package.json | 12 +- packages/nextjs/pages/_app.tsx | 4 +- .../pages/blockexplorer/address/[address].tsx | 28 +- packages/nextjs/pages/blockexplorer/index.tsx | 2 +- .../blockexplorer/transaction/[txHash].tsx | 41 +- .../web3/wagmi-burner/BurnerConnector.ts | 72 ++- .../web3/wagmi-burner/BurnerConnectorTypes.ts | 4 +- .../web3/{wagmiClient.tsx => wagmiConfig.tsx} | 6 +- .../nextjs/services/web3/wagmiConnectors.tsx | 14 +- packages/nextjs/tsconfig.json | 2 +- packages/nextjs/utils/scaffold-eth/block.ts | 12 +- packages/nextjs/utils/scaffold-eth/common.ts | 3 + .../nextjs/utils/scaffold-eth/contract.ts | 71 ++- .../nextjs/utils/scaffold-eth/decodeTxData.ts | 36 +- .../scaffold-eth/fetchPriceFromUniswap.ts | 54 +- .../utils/scaffold-eth/getLocalProvider.ts | 15 - packages/nextjs/utils/scaffold-eth/index.ts | 2 - .../nextjs/utils/scaffold-eth/networks.ts | 5 +- .../utils/scaffold-eth/notification.tsx | 2 +- .../utils/scaffold-eth/parseTxnValue.ts | 24 - yarn.lock | 534 +++++++++--------- 58 files changed, 1041 insertions(+), 1079 deletions(-) create mode 100644 packages/nextjs/components/scaffold-eth/Contract/ContractReadMethods.tsx create mode 100644 packages/nextjs/components/scaffold-eth/Contract/ContractVariables.tsx create mode 100644 packages/nextjs/components/scaffold-eth/Contract/ContractWriteMethods.tsx rename packages/nextjs/services/web3/{wagmiClient.tsx => wagmiConfig.tsx} (53%) create mode 100644 packages/nextjs/utils/scaffold-eth/common.ts delete mode 100644 packages/nextjs/utils/scaffold-eth/getLocalProvider.ts delete mode 100644 packages/nextjs/utils/scaffold-eth/parseTxnValue.ts diff --git a/README.md b/README.md index d0afc2cae..542c0f48b 100644 --- a/README.md +++ b/README.md @@ -213,8 +213,8 @@ const { } = useScaffoldEventHistory({ contractName: "YourContract", eventName: "GreetingChange", - // Specify the starting block number from which to read events. - fromBlock: 31231, + // Specify the starting block number from which to read events, this is a bigint. + fromBlock: 31231n, blockData: true, // Apply filters to the event based on parameter names and values { [parameterName]: value }, filters: { premium: true } @@ -251,13 +251,12 @@ const { data: yourContract } = useScaffoldContract({ await yourContract?.greeting(); // Used to write to a contract and can be called in any function -import { Signer } from "ethers"; -import { useSigner } from "wagmi"; +import { useWalletClient } from "wagmi"; -const { data: signer, isError, isLoading } = useSigner(); +const { data: walletClient } = useWalletClient(); const { data: yourContract } = useScaffoldContract({ contractName: "YourContract", - signerOrProvider: signer as Signer, + walletClient, }); const setGreeting = async () => { // Call the method in any function diff --git a/packages/nextjs/components/blockexplorer/AddressLogsTab.tsx b/packages/nextjs/components/blockexplorer/AddressLogsTab.tsx index 2a548a7b7..9d2ab0e8f 100644 --- a/packages/nextjs/components/blockexplorer/AddressLogsTab.tsx +++ b/packages/nextjs/components/blockexplorer/AddressLogsTab.tsx @@ -1,6 +1,8 @@ +import { Address } from "viem"; import { useContractLogs } from "~~/hooks/scaffold-eth"; +import { replacer } from "~~/utils/scaffold-eth/common"; -export const AddressLogsTab = ({ address }: { address: string }) => { +export const AddressLogsTab = ({ address }: { address: Address }) => { const contractLogs = useContractLogs(address); return ( @@ -9,7 +11,7 @@ export const AddressLogsTab = ({ address }: { address: string }) => {
           {contractLogs.map((log, i) => (
             
- Log: {JSON.stringify(log, null, 2)} + Log: {JSON.stringify(log, replacer, 2)}
))}
diff --git a/packages/nextjs/components/blockexplorer/AddressStorageTab.tsx b/packages/nextjs/components/blockexplorer/AddressStorageTab.tsx index 85f869c66..046dd908e 100644 --- a/packages/nextjs/components/blockexplorer/AddressStorageTab.tsx +++ b/packages/nextjs/components/blockexplorer/AddressStorageTab.tsx @@ -1,8 +1,11 @@ import { useEffect, useState } from "react"; -import { localhost } from "wagmi/chains"; -import { getLocalProvider } from "~~/utils/scaffold-eth"; +import { createPublicClient, http, toHex } from "viem"; +import { hardhat } from "wagmi/chains"; -const provider = getLocalProvider(localhost); +const publicClient = createPublicClient({ + chain: hardhat, + transport: http(), +}); export const AddressStorageTab = ({ address }: { address: string }) => { const [storage, setStorage] = useState([]); @@ -14,7 +17,10 @@ export const AddressStorageTab = ({ address }: { address: string }) => { let idx = 0; while (true) { - const storageAtPosition = await provider?.getStorageAt(address, idx); + const storageAtPosition = await publicClient.getStorageAt({ + address: address, + slot: toHex(idx), + }); if (storageAtPosition === "0x" + "0".repeat(64)) break; diff --git a/packages/nextjs/components/blockexplorer/SearchBar.tsx b/packages/nextjs/components/blockexplorer/SearchBar.tsx index 73817b91d..e9877c712 100644 --- a/packages/nextjs/components/blockexplorer/SearchBar.tsx +++ b/packages/nextjs/components/blockexplorer/SearchBar.tsx @@ -1,19 +1,20 @@ import { useState } from "react"; import { useRouter } from "next/router"; -import { ethers } from "ethers"; -import { localhost } from "wagmi/chains"; -import { getLocalProvider } from "~~/utils/scaffold-eth"; +import { isAddress, isHex } from "viem"; +import { usePublicClient } from "wagmi"; +import { hardhat } from "wagmi/chains"; -const provider = getLocalProvider(localhost); export const SearchBar = () => { const [searchInput, setSearchInput] = useState(""); const router = useRouter(); + const client = usePublicClient({ chainId: hardhat.id }); + const handleSearch = async (event: React.FormEvent) => { event.preventDefault(); - if (ethers.utils.isHexString(searchInput)) { + if (isHex(searchInput)) { try { - const tx = await provider?.getTransaction(searchInput); + const tx = await client.getTransaction({ hash: searchInput }); if (tx) { router.push(`/blockexplorer/transaction/${searchInput}`); return; @@ -23,7 +24,7 @@ export const SearchBar = () => { } } - if (ethers.utils.isAddress(searchInput)) { + if (isAddress(searchInput)) { router.push(`/blockexplorer/address/${searchInput}`); return; } diff --git a/packages/nextjs/components/blockexplorer/TransactionsTable.tsx b/packages/nextjs/components/blockexplorer/TransactionsTable.tsx index e94135c86..469548f0f 100644 --- a/packages/nextjs/components/blockexplorer/TransactionsTable.tsx +++ b/packages/nextjs/components/blockexplorer/TransactionsTable.tsx @@ -1,7 +1,7 @@ -import { ethers } from "ethers"; +import { formatEther } from "viem"; import { TransactionHash } from "~~/components/blockexplorer/TransactionHash"; import { Address } from "~~/components/scaffold-eth"; -import { getTargetNetwork } from "~~/utils/scaffold-eth"; +import { TransactionWithFunction, getTargetNetwork } from "~~/utils/scaffold-eth"; import { TransactionsTableProps } from "~~/utils/scaffold-eth/"; export const TransactionsTable = ({ blocks, transactionReceipts, isLoading }: TransactionsTableProps) => { @@ -36,10 +36,10 @@ export const TransactionsTable = ({ blocks, transactionReceipts, isLoading }: Tr ) : ( {blocks.map(block => - block.transactions.map(tx => { + (block.transactions as TransactionWithFunction[]).map(tx => { const receipt = transactionReceipts[tx.hash]; - const timeMined = new Date(block.timestamp * 1000).toLocaleString(); - const functionCalled = tx.data.substring(0, 10); + const timeMined = new Date(Number(block.timestamp) * 1000).toLocaleString(); + const functionCalled = tx.input.substring(0, 10); return ( @@ -52,7 +52,7 @@ export const TransactionsTable = ({ blocks, transactionReceipts, isLoading }: Tr {functionCalled} )} - {block.number} + {block.number?.toString()} {timeMined}
@@ -68,7 +68,7 @@ export const TransactionsTable = ({ blocks, transactionReceipts, isLoading }: Tr )} - {ethers.utils.formatEther(tx.value)} {targetNetwork.nativeCurrency.symbol} + {formatEther(tx.value)} {targetNetwork.nativeCurrency.symbol} ); diff --git a/packages/nextjs/components/example-ui/ContractData.tsx b/packages/nextjs/components/example-ui/ContractData.tsx index 317aa6b3a..98786141c 100644 --- a/packages/nextjs/components/example-ui/ContractData.tsx +++ b/packages/nextjs/components/example-ui/ContractData.tsx @@ -33,8 +33,11 @@ export const ContractData = () => { useScaffoldEventSubscriber({ contractName: "YourContract", eventName: "GreetingChange", - listener: (greetingSetter, newGreeting, premium, value) => { - console.log(greetingSetter, newGreeting, premium, value); + listener: logs => { + logs.map(log => { + const { greetingSetter, value, premium, newGreeting } = log.args; + console.log("📡 GreetingChange event", greetingSetter, value, premium, newGreeting); + }); }, }); @@ -45,7 +48,7 @@ export const ContractData = () => { } = useScaffoldEventHistory({ contractName: "YourContract", eventName: "GreetingChange", - fromBlock: Number(process.env.NEXT_PUBLIC_DEPLOY_BLOCK) || 0, + fromBlock: process.env.NEXT_PUBLIC_DEPLOY_BLOCK ? BigInt(process.env.NEXT_PUBLIC_DEPLOY_BLOCK) : 0n, filters: { greetingSetter: address }, blockData: true, }); diff --git a/packages/nextjs/components/scaffold-eth/Address.tsx b/packages/nextjs/components/scaffold-eth/Address.tsx index 903ee9d26..3b0c9172d 100644 --- a/packages/nextjs/components/scaffold-eth/Address.tsx +++ b/packages/nextjs/components/scaffold-eth/Address.tsx @@ -1,9 +1,8 @@ import { useEffect, useState } from "react"; import Link from "next/link"; -import { ethers } from "ethers"; -import { isAddress } from "ethers/lib/utils"; import Blockies from "react-blockies"; import { CopyToClipboard } from "react-copy-to-clipboard"; +import { isAddress } from "viem"; import { useEnsAvatar, useEnsName } from "wagmi"; import { hardhat } from "wagmi/chains"; import { CheckCircleIcon, DocumentDuplicateIcon } from "@heroicons/react/24/outline"; @@ -36,8 +35,8 @@ export const Address = ({ address, disableAddressLink, format, size = "base" }: const { data: fetchedEns } = useEnsName({ address, enabled: isAddress(address ?? ""), chainId: 1 }); const { data: fetchedEnsAvatar } = useEnsAvatar({ - address, - enabled: isAddress(address ?? ""), + name: fetchedEns, + enabled: Boolean(fetchedEns), chainId: 1, cacheTime: 30_000, }); @@ -63,7 +62,7 @@ export const Address = ({ address, disableAddressLink, format, size = "base" }: ); } - if (!ethers.utils.isAddress(address)) { + if (!isAddress(address)) { return Wrong address; } diff --git a/packages/nextjs/components/scaffold-eth/Contract/ContractInput.tsx b/packages/nextjs/components/scaffold-eth/Contract/ContractInput.tsx index e5119bffc..396f4a9e3 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/ContractInput.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/ContractInput.tsx @@ -1,5 +1,5 @@ import { Dispatch, SetStateAction } from "react"; -import { utils } from "ethers"; +import { AbiParameter } from "abitype"; import { AddressInput, Bytes32Input, @@ -11,9 +11,9 @@ import { type ContractInputProps = { setForm: Dispatch>>; - form: Record; + form: Record | undefined; stateObjectKey: string; - paramType: utils.ParamType; + paramType: AbiParameter; }; /** @@ -22,7 +22,7 @@ type ContractInputProps = { export const ContractInput = ({ setForm, form, stateObjectKey, paramType }: ContractInputProps) => { const inputProps = { name: stateObjectKey, - value: form[stateObjectKey], + value: form?.[stateObjectKey], placeholder: paramType.name ? `${paramType.type} ${paramType.name}` : paramType.type, onChange: (value: any) => { setForm(form => ({ ...form, [stateObjectKey]: value })); diff --git a/packages/nextjs/components/scaffold-eth/Contract/ContractReadMethods.tsx b/packages/nextjs/components/scaffold-eth/Contract/ContractReadMethods.tsx new file mode 100644 index 000000000..eaf11a8fd --- /dev/null +++ b/packages/nextjs/components/scaffold-eth/Contract/ContractReadMethods.tsx @@ -0,0 +1,29 @@ +import { ReadOnlyFunctionForm } from "./ReadOnlyFunctionForm"; +import { Abi, AbiFunction } from "abitype"; +import { Contract, ContractName } from "~~/utils/scaffold-eth/contract"; + +export const ContractReadMethods = ({ deployedContractData }: { deployedContractData: Contract }) => { + if (!deployedContractData) { + return null; + } + + const functionsToDisplay = ( + ((deployedContractData.abi || []) as Abi).filter(part => part.type === "function") as AbiFunction[] + ).filter(fn => { + const isQueryableWithParams = + (fn.stateMutability === "view" || fn.stateMutability === "pure") && fn.inputs.length > 0; + return isQueryableWithParams; + }); + + if (!functionsToDisplay.length) { + return <>No read methods; + } + + return ( + <> + {functionsToDisplay.map(fn => ( + + ))} + + ); +}; diff --git a/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx b/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx index f8be03df1..202ad19e0 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/ContractUI.tsx @@ -1,15 +1,9 @@ -import { useMemo, useState } from "react"; -import { Abi } from "abitype"; -import { useContract, useProvider } from "wagmi"; +import { useReducer } from "react"; +import { ContractReadMethods } from "./ContractReadMethods"; +import { ContractVariables } from "./ContractVariables"; +import { ContractWriteMethods } from "./ContractWriteMethods"; import { Spinner } from "~~/components/Spinner"; -import { - Address, - Balance, - getAllContractFunctions, - getContractReadOnlyMethodsWithParams, - getContractVariablesAndNoParamsReadMethods, - getContractWriteMethods, -} from "~~/components/scaffold-eth"; +import { Address, Balance } from "~~/components/scaffold-eth"; import { useDeployedContractInfo, useNetworkColor } from "~~/hooks/scaffold-eth"; import { getTargetNetwork } from "~~/utils/scaffold-eth"; import { ContractName } from "~~/utils/scaffold-eth/contract"; @@ -23,34 +17,12 @@ type ContractUIProps = { * UI component to interface with deployed contracts. **/ export const ContractUI = ({ contractName, className = "" }: ContractUIProps) => { - const provider = useProvider(); - const [refreshDisplayVariables, setRefreshDisplayVariables] = useState(false); + const [refreshDisplayVariables, triggerRefreshDisplayVariables] = useReducer(value => !value, false); const configuredNetwork = getTargetNetwork(); const { data: deployedContractData, isLoading: deployedContractLoading } = useDeployedContractInfo(contractName); const networkColor = useNetworkColor(); - const contract = useContract({ - address: deployedContractData?.address, - abi: deployedContractData?.abi as Abi, - signerOrProvider: provider, - }); - - const displayedContractFunctions = useMemo(() => getAllContractFunctions(contract), [contract]); - - const contractVariablesDisplay = useMemo(() => { - return getContractVariablesAndNoParamsReadMethods(contract, displayedContractFunctions, refreshDisplayVariables); - }, [contract, displayedContractFunctions, refreshDisplayVariables]); - - const contractMethodsDisplay = useMemo( - () => getContractReadOnlyMethodsWithParams(contract, displayedContractFunctions), - [contract, displayedContractFunctions], - ); - const contractWriteMethods = useMemo( - () => getContractWriteMethods(contract, displayedContractFunctions, setRefreshDisplayVariables), - [contract, displayedContractFunctions], - ); - if (deployedContractLoading) { return (
@@ -90,7 +62,10 @@ export const ContractUI = ({ contractName, className = "" }: ContractUIProps) => )}
- {contractVariablesDisplay.methods.length > 0 ? contractVariablesDisplay.methods : "No contract variables"} +
@@ -102,7 +77,7 @@ export const ContractUI = ({ contractName, className = "" }: ContractUIProps) =>
- {contractMethodsDisplay.methods.length > 0 ? contractMethodsDisplay.methods : "No read methods"} +
@@ -114,7 +89,10 @@ export const ContractUI = ({ contractName, className = "" }: ContractUIProps) =>
- {contractWriteMethods.methods.length > 0 ? contractWriteMethods.methods : "No write methods"} +
diff --git a/packages/nextjs/components/scaffold-eth/Contract/ContractVariables.tsx b/packages/nextjs/components/scaffold-eth/Contract/ContractVariables.tsx new file mode 100644 index 000000000..804569927 --- /dev/null +++ b/packages/nextjs/components/scaffold-eth/Contract/ContractVariables.tsx @@ -0,0 +1,40 @@ +import { DisplayVariable } from "./DisplayVariable"; +import { Abi, AbiFunction } from "abitype"; +import { Contract, ContractName } from "~~/utils/scaffold-eth/contract"; + +export const ContractVariables = ({ + refreshDisplayVariables, + deployedContractData, +}: { + refreshDisplayVariables: boolean; + deployedContractData: Contract; +}) => { + if (!deployedContractData) { + return null; + } + + const functionsToDisplay = ( + (deployedContractData.abi as Abi).filter(part => part.type === "function") as AbiFunction[] + ).filter(fn => { + const isQueryableWithNoParams = + (fn.stateMutability === "view" || fn.stateMutability === "pure") && fn.inputs.length === 0; + return isQueryableWithNoParams; + }); + + if (!functionsToDisplay.length) { + return <>No contract variables; + } + + return ( + <> + {functionsToDisplay.map(fn => ( + + ))} + + ); +}; diff --git a/packages/nextjs/components/scaffold-eth/Contract/ContractWriteMethods.tsx b/packages/nextjs/components/scaffold-eth/Contract/ContractWriteMethods.tsx new file mode 100644 index 000000000..c13fe8c22 --- /dev/null +++ b/packages/nextjs/components/scaffold-eth/Contract/ContractWriteMethods.tsx @@ -0,0 +1,39 @@ +import { WriteOnlyFunctionForm } from "./WriteOnlyFunctionForm"; +import { Abi, AbiFunction } from "abitype"; +import { Contract, ContractName } from "~~/utils/scaffold-eth/contract"; + +export const ContractWriteMethods = ({ + onChange, + deployedContractData, +}: { + onChange: () => void; + deployedContractData: Contract; +}) => { + if (!deployedContractData) { + return null; + } + + const functionsToDisplay = ( + (deployedContractData.abi as Abi).filter(part => part.type === "function") as AbiFunction[] + ).filter(fn => { + const isWriteableFunction = fn.stateMutability !== "view" && fn.stateMutability !== "pure"; + return isWriteableFunction; + }); + + if (!functionsToDisplay.length) { + return <>No write methods; + } + + return ( + <> + {functionsToDisplay.map((fn, idx) => ( + + ))} + + ); +}; diff --git a/packages/nextjs/components/scaffold-eth/Contract/DisplayVariable.tsx b/packages/nextjs/components/scaffold-eth/Contract/DisplayVariable.tsx index 13deccd0d..f0f05f61a 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/DisplayVariable.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/DisplayVariable.tsx @@ -1,32 +1,27 @@ import { useEffect } from "react"; -import { FunctionFragment } from "ethers/lib/utils"; +import { Abi, AbiFunction } from "abitype"; +import { Address } from "viem"; import { useContractRead } from "wagmi"; import { ArrowPathIcon } from "@heroicons/react/24/outline"; import { displayTxResult } from "~~/components/scaffold-eth"; import { useAnimationConfig } from "~~/hooks/scaffold-eth"; -import { getTargetNetwork, notification } from "~~/utils/scaffold-eth"; +import { notification } from "~~/utils/scaffold-eth"; -type TDisplayVariableProps = { - functionFragment: FunctionFragment; - contractAddress: string; +type DisplayVariableProps = { + contractAddress: Address; + abiFunction: AbiFunction; refreshDisplayVariables: boolean; }; -export const DisplayVariable = ({ - contractAddress, - functionFragment, - refreshDisplayVariables, -}: TDisplayVariableProps) => { +export const DisplayVariable = ({ contractAddress, abiFunction, refreshDisplayVariables }: DisplayVariableProps) => { const { data: result, isFetching, refetch, } = useContractRead({ - chainId: getTargetNetwork().id, address: contractAddress, - abi: [functionFragment], - functionName: functionFragment.name, - args: [], + functionName: abiFunction.name, + abi: [abiFunction] as Abi, onError: error => { notification.error(error.message); }, @@ -41,7 +36,7 @@ export const DisplayVariable = ({ return (
-

{functionFragment.name}

+

{abiFunction.name}

diff --git a/packages/nextjs/components/scaffold-eth/Contract/ReadOnlyFunctionForm.tsx b/packages/nextjs/components/scaffold-eth/Contract/ReadOnlyFunctionForm.tsx index d2d461d77..92a115fd4 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/ReadOnlyFunctionForm.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/ReadOnlyFunctionForm.tsx @@ -1,46 +1,38 @@ import { useState } from "react"; -import { FunctionFragment } from "ethers/lib/utils"; +import { Abi, AbiFunction } from "abitype"; +import { Address } from "viem"; import { useContractRead } from "wagmi"; import { ContractInput, displayTxResult, getFunctionInputKey, + getInitialFormState, getParsedContractFunctionArgs, } from "~~/components/scaffold-eth"; -import { getTargetNetwork, notification } from "~~/utils/scaffold-eth"; - -const getInitialFormState = (functionFragment: FunctionFragment) => { - const initialForm: Record = {}; - functionFragment.inputs.forEach((input, inputIndex) => { - const key = getFunctionInputKey(functionFragment, input, inputIndex); - initialForm[key] = ""; - }); - return initialForm; -}; +import { notification } from "~~/utils/scaffold-eth"; type TReadOnlyFunctionFormProps = { - functionFragment: FunctionFragment; - contractAddress: string; + contractAddress: Address; + abiFunction: AbiFunction; }; -export const ReadOnlyFunctionForm = ({ functionFragment, contractAddress }: TReadOnlyFunctionFormProps) => { - const [form, setForm] = useState>(() => getInitialFormState(functionFragment)); +export const ReadOnlyFunctionForm = ({ contractAddress, abiFunction }: TReadOnlyFunctionFormProps) => { + const [form, setForm] = useState>(() => getInitialFormState(abiFunction)); const [result, setResult] = useState(); const { isFetching, refetch } = useContractRead({ - chainId: getTargetNetwork().id, address: contractAddress, - abi: [functionFragment], - functionName: functionFragment.name, + functionName: abiFunction.name, + abi: [abiFunction] as Abi, args: getParsedContractFunctionArgs(form), enabled: false, - onError: error => { + onError: (error: any) => { notification.error(error.message); }, }); - const inputs = functionFragment.inputs.map((input, inputIndex) => { - const key = getFunctionInputKey(functionFragment, input, inputIndex); + const inputElements = abiFunction.inputs.map((input, inputIndex) => { + const key = getFunctionInputKey(abiFunction.name, input, inputIndex); return ( -

{functionFragment.name}

- {inputs} +

{abiFunction.name}

+ {inputElements}
{result !== null && result !== undefined && ( diff --git a/packages/nextjs/components/scaffold-eth/Contract/TxReceipt.tsx b/packages/nextjs/components/scaffold-eth/Contract/TxReceipt.tsx index aab26add6..12570b464 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/TxReceipt.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/TxReceipt.tsx @@ -1,9 +1,8 @@ -import { TransactionReceipt } from "@ethersproject/abstract-provider"; -import { BigNumber } from "ethers"; +import { TransactionReceipt } from "viem"; import { displayTxResult } from "~~/components/scaffold-eth"; export const TxReceipt = ( - txResult: string | number | BigNumber | Record | TransactionReceipt | undefined, + txResult: string | number | bigint | Record | TransactionReceipt | undefined, ) => { return (
diff --git a/packages/nextjs/components/scaffold-eth/Contract/WriteOnlyFunctionForm.tsx b/packages/nextjs/components/scaffold-eth/Contract/WriteOnlyFunctionForm.tsx index bc349cc2d..21c73c2a4 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/WriteOnlyFunctionForm.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/WriteOnlyFunctionForm.tsx @@ -1,72 +1,52 @@ -import { Dispatch, SetStateAction, useEffect, useState } from "react"; -import { TransactionReceipt } from "@ethersproject/abstract-provider"; -import { BigNumber } from "ethers"; -import { FunctionFragment } from "ethers/lib/utils"; +import { useEffect, useState } from "react"; +import { Abi, AbiFunction } from "abitype"; +import { Address, TransactionReceipt } from "viem"; import { useContractWrite, useNetwork, useWaitForTransaction } from "wagmi"; import { ContractInput, IntegerInput, TxReceipt, getFunctionInputKey, + getInitialFormState, getParsedContractFunctionArgs, - getParsedEthersError, + getParsedError, } from "~~/components/scaffold-eth"; import { useTransactor } from "~~/hooks/scaffold-eth"; -import { getTargetNetwork, notification, parseTxnValue } from "~~/utils/scaffold-eth"; +import { getTargetNetwork, notification } from "~~/utils/scaffold-eth"; -// TODO set sensible initial state values to avoid error on first render, also put it in utilsContract -const getInitialFormState = (functionFragment: FunctionFragment) => { - const initialForm: Record = {}; - functionFragment.inputs.forEach((input, inputIndex) => { - const key = getFunctionInputKey(functionFragment, input, inputIndex); - initialForm[key] = ""; - }); - return initialForm; -}; - -type TWriteOnlyFunctionFormProps = { - functionFragment: FunctionFragment; - contractAddress: string; - setRefreshDisplayVariables: Dispatch>; +type WriteOnlyFunctionFormProps = { + abiFunction: AbiFunction; + onChange: () => void; + contractAddress: Address; }; -export const WriteOnlyFunctionForm = ({ - functionFragment, - contractAddress, - setRefreshDisplayVariables, -}: TWriteOnlyFunctionFormProps) => { - const [form, setForm] = useState>(() => getInitialFormState(functionFragment)); - const [txValue, setTxValue] = useState(""); +export const WriteOnlyFunctionForm = ({ abiFunction, onChange, contractAddress }: WriteOnlyFunctionFormProps) => { + const [form, setForm] = useState>(() => getInitialFormState(abiFunction)); + const [txValue, setTxValue] = useState(""); const { chain } = useNetwork(); const writeTxn = useTransactor(); const writeDisabled = !chain || chain?.id !== getTargetNetwork().id; - // We are omitting usePrepareContractWrite here to avoid unnecessary RPC calls and wrong gas estimations. - // See: - // - https://github.com/scaffold-eth/se-2/issues/59 - // - https://github.com/scaffold-eth/se-2/pull/86#issuecomment-1374902738 const { data: result, isLoading, writeAsync, } = useContractWrite({ + chainId: getTargetNetwork().id, address: contractAddress, - functionName: functionFragment.name, - abi: [functionFragment], + functionName: abiFunction.name, + abi: [abiFunction] as Abi, args: getParsedContractFunctionArgs(form), - mode: "recklesslyUnprepared", - overrides: { - value: typeof txValue === "string" ? parseTxnValue(txValue) : txValue, - }, }); const handleWrite = async () => { if (writeAsync) { try { - await writeTxn(writeAsync()); - setRefreshDisplayVariables(prevState => !prevState); + const makeWriteWithParams = () => writeAsync({ value: BigInt(txValue) }); + await writeTxn(makeWriteWithParams); + onChange(); } catch (e: any) { - const message = getParsedEthersError(e); + const message = getParsedError(e); notification.error(message); } } @@ -81,8 +61,8 @@ export const WriteOnlyFunctionForm = ({ }, [txResult]); // TODO use `useMemo` to optimize also update in ReadOnlyFunctionForm - const inputs = functionFragment.inputs.map((input, inputIndex) => { - const key = getFunctionInputKey(functionFragment, input, inputIndex); + const inputs = abiFunction.inputs.map((input, inputIndex) => { + const key = getFunctionInputKey(abiFunction.name, input, inputIndex); return ( ); }); - const zeroInputs = inputs.length === 0 && !functionFragment.payable; + const zeroInputs = inputs.length === 0 && abiFunction.stateMutability !== "payable"; return (
-

{functionFragment.name}

+

{abiFunction.name}

{inputs} - {functionFragment.payable ? ( + {abiFunction.stateMutability === "payable" ? ( { diff --git a/packages/nextjs/components/scaffold-eth/Contract/utilsContract.tsx b/packages/nextjs/components/scaffold-eth/Contract/utilsContract.tsx index 3cbbf0d25..286fa3b27 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/utilsContract.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/utilsContract.tsx @@ -1,166 +1,43 @@ -import { Dispatch, SetStateAction } from "react"; -import { Contract, utils } from "ethers"; -import { FunctionFragment } from "ethers/lib/utils"; -import { DisplayVariable, ReadOnlyFunctionForm, WriteOnlyFunctionForm } from "~~/components/scaffold-eth"; - -/** - * @param {Contract} contract - * @returns {FunctionFragment[]} array of function fragments - */ -const getAllContractFunctions = (contract: Contract | null): FunctionFragment[] => { - return contract ? Object.values(contract.interface.functions).filter(fn => fn.type === "function") : []; -}; - -/** - * @dev used to filter all readOnly functions with zero params - * @param {Contract} contract - * @param {FunctionFragment[]} contractMethodsAndVariables - array of all functions in the contract - * @param {boolean} refreshDisplayVariables refetch values - * @returns { methods: (JSX.Element | null)[] } array of DisplayVariable component - * which has corresponding input field for param type and button to read - */ -const getContractVariablesAndNoParamsReadMethods = ( - contract: Contract | null, - contractMethodsAndVariables: FunctionFragment[], - refreshDisplayVariables: boolean, -): { methods: (JSX.Element | null)[] } => { - return { - methods: contract - ? contractMethodsAndVariables - .map(fn => { - const isQueryableWithNoParams = - (fn.stateMutability === "view" || fn.stateMutability === "pure") && fn.inputs.length === 0; - if (isQueryableWithNoParams) { - return ( - - ); - } - return null; - }) - .filter(n => n) - : [], - }; -}; - -/** - * @dev used to filter all readOnly functions with greater than or equal to 1 params - * @param {Contract} contract - * @param {FunctionFragment[]} contractMethodsAndVariables - array of all functions in the contract - * @returns { methods: (JSX.Element | null)[] } array of ReadOnlyFunctionForm component - * which has corresponding input field for param type and button to read - */ -const getContractReadOnlyMethodsWithParams = ( - contract: Contract | null, - contractMethodsAndVariables: FunctionFragment[], -): { methods: (JSX.Element | null)[] } => { - return { - methods: contract - ? contractMethodsAndVariables - .map((fn, idx) => { - const isQueryableWithParams = - (fn.stateMutability === "view" || fn.stateMutability === "pure") && fn.inputs.length > 0; - if (isQueryableWithParams) { - return ( - - ); - } - return null; - }) - .filter(n => n) - : [], - }; -}; - -/** - * @dev used to filter all write functions - * @param {Contract} contract - * @param {FunctionFragment[]} contractMethodsAndVariables - array of all functions in the contract - * @param {Dispatch>} setRefreshDisplayVariables - trigger variable refresh - * @returns { methods: (JSX.Element | null)[] } array of WriteOnlyFunctionForm component - * which has corresponding input field for param type, txnValue input if required and button to send transaction - */ -const getContractWriteMethods = ( - contract: Contract | null, - contractMethodsAndVariables: FunctionFragment[], - setRefreshDisplayVariables: Dispatch>, -): { methods: (JSX.Element | null)[] } => { - return { - methods: contract - ? contractMethodsAndVariables - .map((fn, idx) => { - const isWriteableFunction = fn.stateMutability !== "view" && fn.stateMutability !== "pure"; - if (isWriteableFunction) { - return ( - - ); - } - return null; - }) - .filter(n => n) - : [], - }; -}; +import { AbiFunction, AbiParameter } from "abitype"; +import { BaseError as BaseViemError } from "viem"; /** * @dev utility function to generate key corresponding to function metaData - * @param {FunctionFragment} functionInfo + * @param {AbiFunction} functionName * @param {utils.ParamType} input - object containing function name and input type corresponding to index * @param {number} inputIndex * @returns {string} key */ -const getFunctionInputKey = (functionInfo: FunctionFragment, input: utils.ParamType, inputIndex: number): string => { +const getFunctionInputKey = (functionName: string, input: AbiParameter, inputIndex: number): string => { const name = input?.name || `input_${inputIndex}_`; - return functionInfo.name + "_" + name + "_" + input.type + "_" + input.baseType; + return functionName + "_" + name + "_" + input.internalType + "_" + input.type; }; /** - * @dev utility function to parse error thrown by ethers - * @param e - ethers error object + * @dev utility function to parse error + * @param e - error object * @returns {string} parsed error string */ -const getParsedEthersError = (e: any): string => { - let message = - e.data && e.data.message - ? e.data.message - : e.error && JSON.parse(JSON.stringify(e.error)).body - ? JSON.parse(JSON.parse(JSON.stringify(e.error)).body).error.message - : e.data - ? e.data - : JSON.stringify(e); - if (!e.error && e.message) { - message = e.message; - } +const getParsedError = (e: any | BaseViemError): string => { + let message = e.message ?? "An unknown error occurred"; - console.log("Attempt to clean up:", message); - try { - const obj = JSON.parse(message); - if (obj && obj.body) { - const errorObj = JSON.parse(obj.body); - if (errorObj && errorObj.error && errorObj.error.message) { - message = errorObj.error.message; - } + if (e instanceof BaseViemError) { + if (e.details) { + message = e.details; + } else if (e.shortMessage) { + message = e.shortMessage; + } else if (e.message) { + message = e.message; + } else if (e.name) { + message = e.name; } - } catch (e) { - //ignore } return message; }; +// This regex is used to identify array types in the form of `type[size]` +const ARRAY_TYPE_REGEX = /\[.*\]$/; /** * @dev Parse form input with array support * @param {Record} form - form object containing key value pairs @@ -174,7 +51,7 @@ const getParsedContractFunctionArgs = (form: Record) => { const baseTypeOfArg = keySplitArray[keySplitArray.length - 1]; let valueOfArg = form[key]; - if (["array", "tuple"].includes(baseTypeOfArg)) { + if (ARRAY_TYPE_REGEX.test(baseTypeOfArg) || baseTypeOfArg === "tuple") { valueOfArg = JSON.parse(valueOfArg); } else if (baseTypeOfArg === "bool") { if (["true", "1", "0x1", "0x01", "0x0001"].includes(valueOfArg)) { @@ -191,12 +68,14 @@ const getParsedContractFunctionArgs = (form: Record) => { return parsedArguments; }; -export { - getAllContractFunctions, - getContractReadOnlyMethodsWithParams, - getContractVariablesAndNoParamsReadMethods, - getContractWriteMethods, - getFunctionInputKey, - getParsedContractFunctionArgs, - getParsedEthersError, +const getInitialFormState = (abiFunction: AbiFunction) => { + const initialForm: Record = {}; + if (!abiFunction.inputs) return initialForm; + abiFunction.inputs.forEach((input, inputIndex) => { + const key = getFunctionInputKey(abiFunction.name, input, inputIndex); + initialForm[key] = ""; + }); + return initialForm; }; + +export { getFunctionInputKey, getInitialFormState, getParsedContractFunctionArgs, getParsedError }; diff --git a/packages/nextjs/components/scaffold-eth/Contract/utilsDisplay.tsx b/packages/nextjs/components/scaffold-eth/Contract/utilsDisplay.tsx index 807645920..5fcf3103a 100644 --- a/packages/nextjs/components/scaffold-eth/Contract/utilsDisplay.tsx +++ b/packages/nextjs/components/scaffold-eth/Contract/utilsDisplay.tsx @@ -1,10 +1,17 @@ import { ReactElement } from "react"; -import { TransactionResponse } from "@ethersproject/providers"; -import { formatUnits } from "@ethersproject/units"; -import { BigNumber } from "ethers"; +import { TransactionBase, TransactionReceipt, formatEther } from "viem"; import { Address } from "~~/components/scaffold-eth"; - -type DisplayContent = string | number | BigNumber | Record | TransactionResponse | undefined | unknown; +import { replacer } from "~~/utils/scaffold-eth/common"; + +type DisplayContent = + | string + | number + | bigint + | Record + | TransactionBase + | TransactionReceipt + | undefined + | unknown; export const displayTxResult = ( displayContent: DisplayContent | DisplayContent[], @@ -14,11 +21,16 @@ export const displayTxResult = ( return ""; } - if (displayContent && BigNumber.isBigNumber(displayContent)) { + if (typeof displayContent === "bigint") { try { - return displayContent.toNumber(); + const asNumber = Number(displayContent); + if (asNumber <= Number.MAX_SAFE_INTEGER && asNumber >= Number.MIN_SAFE_INTEGER) { + return asNumber; + } else { + return "Ξ" + formatEther(displayContent); + } } catch (e) { - return "Ξ" + formatUnits(displayContent, "ether"); + return "Ξ" + formatEther(displayContent); } } @@ -26,10 +38,10 @@ export const displayTxResult = ( return asText ? displayContent :
; } - if (displayContent && Array.isArray(displayContent)) { + if (Array.isArray(displayContent)) { const mostReadable = (v: DisplayContent) => ["number", "boolean"].includes(typeof v) ? v : displayTxResultAsText(v); - const displayable = JSON.stringify(displayContent.map(mostReadable)); + const displayable = JSON.stringify(displayContent.map(mostReadable), replacer); return asText ? ( displayable @@ -38,7 +50,7 @@ export const displayTxResult = ( ); } - return JSON.stringify(displayContent, null, 2); + return JSON.stringify(displayContent, replacer, 2); }; const displayTxResultAsText = (displayContent: DisplayContent) => displayTxResult(displayContent, true); diff --git a/packages/nextjs/components/scaffold-eth/Faucet.tsx b/packages/nextjs/components/scaffold-eth/Faucet.tsx index bf8a61dbb..251d4ee14 100644 --- a/packages/nextjs/components/scaffold-eth/Faucet.tsx +++ b/packages/nextjs/components/scaffold-eth/Faucet.tsx @@ -1,37 +1,36 @@ import { useEffect, useState } from "react"; -import { ethers } from "ethers"; +import { Address as AddressType, createWalletClient, http, parseEther } from "viem"; import { useNetwork } from "wagmi"; -import { hardhat, localhost } from "wagmi/chains"; +import { hardhat } from "wagmi/chains"; import { BanknotesIcon } from "@heroicons/react/24/outline"; -import { Address, AddressInput, Balance, EtherInput, getParsedEthersError } from "~~/components/scaffold-eth"; +import { Address, AddressInput, Balance, EtherInput, getParsedError } from "~~/components/scaffold-eth"; import { useTransactor } from "~~/hooks/scaffold-eth"; -import { getLocalProvider, notification } from "~~/utils/scaffold-eth"; +import { notification } from "~~/utils/scaffold-eth"; // Account index to use from generated hardhat accounts. const FAUCET_ACCOUNT_INDEX = 0; -const provider = getLocalProvider(localhost); - /** * Faucet modal which lets you send ETH to any address. */ export const Faucet = () => { const [loading, setLoading] = useState(false); - const [inputAddress, setInputAddress] = useState(""); - const [faucetAddress, setFaucetAddress] = useState(""); + const [inputAddress, setInputAddress] = useState(); + const [faucetAddress, setFaucetAddress] = useState(); const [sendValue, setSendValue] = useState(""); const { chain: ConnectedChain } = useNetwork(); - const signer = provider?.getSigner(FAUCET_ACCOUNT_INDEX); - const faucetTxn = useTransactor(signer); + const localWalletClient = createWalletClient({ + chain: hardhat, + transport: http(), + }); + const faucetTxn = useTransactor(localWalletClient); useEffect(() => { const getFaucetAddress = async () => { try { - if (provider) { - const accounts = await provider.listAccounts(); - setFaucetAddress(accounts[FAUCET_ACCOUNT_INDEX]); - } + const accounts = await localWalletClient.getAddresses(); + setFaucetAddress(accounts[FAUCET_ACCOUNT_INDEX]); } catch (error) { notification.error( <> @@ -49,17 +48,25 @@ export const Faucet = () => { } }; getFaucetAddress(); - }, []); + }, [localWalletClient]); const sendETH = async () => { + if (!faucetAddress) { + return; + } try { setLoading(true); - await faucetTxn({ to: inputAddress, value: ethers.utils.parseEther(sendValue) }); + await faucetTxn({ + to: inputAddress, + value: parseEther(sendValue as `${number}`), + account: faucetAddress, + chain: hardhat, + }); setLoading(false); - setInputAddress(""); + setInputAddress(undefined); setSendValue(""); } catch (error) { - const parsedError = getParsedEthersError(error); + const parsedError = getParsedError(error); console.error("⚡️ ~ file: Faucet.tsx:sendETH ~ error", error); notification.error(parsedError); setLoading(false); @@ -103,7 +110,7 @@ export const Faucet = () => {
setInputAddress(value)} /> setSendValue(value)} /> diff --git a/packages/nextjs/components/scaffold-eth/FaucetButton.tsx b/packages/nextjs/components/scaffold-eth/FaucetButton.tsx index dd630f822..6ce26c4d0 100644 --- a/packages/nextjs/components/scaffold-eth/FaucetButton.tsx +++ b/packages/nextjs/components/scaffold-eth/FaucetButton.tsx @@ -1,13 +1,13 @@ import { useState } from "react"; -import { ethers } from "ethers"; +import { createWalletClient, http, parseEther } from "viem"; import { useAccount, useNetwork } from "wagmi"; -import { hardhat, localhost } from "wagmi/chains"; +import { hardhat } from "wagmi/chains"; import { BanknotesIcon } from "@heroicons/react/24/outline"; import { useAccountBalance, useTransactor } from "~~/hooks/scaffold-eth"; -import { getLocalProvider } from "~~/utils/scaffold-eth"; // Number of ETH faucet sends to an address const NUM_OF_ETH = "1"; +const FAUCET_ADDRESS = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; /** * FaucetButton button which lets you grab eth. @@ -17,14 +17,21 @@ export const FaucetButton = () => { const { balance } = useAccountBalance(address); const { chain: ConnectedChain } = useNetwork(); const [loading, setLoading] = useState(false); - const provider = getLocalProvider(localhost); - const signer = provider?.getSigner(); - const faucetTxn = useTransactor(signer); + const localWalletClient = createWalletClient({ + chain: hardhat, + transport: http(), + }); + const faucetTxn = useTransactor(localWalletClient); const sendETH = async () => { try { setLoading(true); - await faucetTxn({ to: address, value: ethers.utils.parseEther(NUM_OF_ETH) }); + await faucetTxn({ + chain: hardhat, + account: FAUCET_ADDRESS, + to: address, + value: parseEther(NUM_OF_ETH), + }); setLoading(false); } catch (error) { console.error("⚡️ ~ file: FaucetButton.tsx:sendETH ~ error", error); diff --git a/packages/nextjs/components/scaffold-eth/Input/AddressInput.tsx b/packages/nextjs/components/scaffold-eth/Input/AddressInput.tsx index d4f38ebd8..cf44ba616 100644 --- a/packages/nextjs/components/scaffold-eth/Input/AddressInput.tsx +++ b/packages/nextjs/components/scaffold-eth/Input/AddressInput.tsx @@ -1,6 +1,7 @@ import { useCallback, useEffect, useState } from "react"; -import { isAddress } from "ethers/lib/utils"; import Blockies from "react-blockies"; +import { isAddress } from "viem"; +import { Address } from "viem"; import { useEnsAddress, useEnsAvatar, useEnsName } from "wagmi"; import { CommonInputProps, InputBase } from "~~/components/scaffold-eth"; @@ -10,7 +11,7 @@ const isENS = (address = "") => address.endsWith(".eth") || address.endsWith(".x /** * Address input with ENS name resolution */ -export const AddressInput = ({ value, name, placeholder, onChange }: CommonInputProps) => { +export const AddressInput = ({ value, name, placeholder, onChange }: CommonInputProps
) => { const { data: ensAddress, isLoading: isEnsAddressLoading } = useEnsAddress({ name: value, enabled: isENS(value), @@ -27,8 +28,8 @@ export const AddressInput = ({ value, name, placeholder, onChange }: CommonInput }); const { data: ensAvatar } = useEnsAvatar({ - address: value, - enabled: isAddress(value), + name: ensName, + enabled: Boolean(ensName), chainId: 1, cacheTime: 30_000, }); @@ -43,7 +44,7 @@ export const AddressInput = ({ value, name, placeholder, onChange }: CommonInput }, [ensAddress, onChange, value]); const handleChange = useCallback( - (newValue: string) => { + (newValue: Address) => { setEnteredEnsName(undefined); onChange(newValue); }, @@ -51,7 +52,7 @@ export const AddressInput = ({ value, name, placeholder, onChange }: CommonInput ); return ( - name={name} placeholder={placeholder} error={ensAddress === null} diff --git a/packages/nextjs/components/scaffold-eth/Input/Bytes32Input.tsx b/packages/nextjs/components/scaffold-eth/Input/Bytes32Input.tsx index f2e16b112..31b4514eb 100644 --- a/packages/nextjs/components/scaffold-eth/Input/Bytes32Input.tsx +++ b/packages/nextjs/components/scaffold-eth/Input/Bytes32Input.tsx @@ -1,5 +1,5 @@ import { useCallback } from "react"; -import { ethers } from "ethers"; +import { hexToString, isHex, stringToHex } from "viem"; import { CommonInputProps, InputBase } from "~~/components/scaffold-eth"; export const Bytes32Input = ({ value, onChange, name, placeholder }: CommonInputProps) => { @@ -7,11 +7,7 @@ export const Bytes32Input = ({ value, onChange, name, placeholder }: CommonInput if (!value) { return; } - onChange( - ethers.utils.isHexString(value) - ? ethers.utils.parseBytes32String(value) - : ethers.utils.formatBytes32String(value), - ); + onChange(isHex(value) ? hexToString(value, { size: 32 }) : stringToHex(value, { size: 32 })); }, [onChange, value]); return ( diff --git a/packages/nextjs/components/scaffold-eth/Input/BytesInput.tsx b/packages/nextjs/components/scaffold-eth/Input/BytesInput.tsx index 3493aeaa6..f61ff5352 100644 --- a/packages/nextjs/components/scaffold-eth/Input/BytesInput.tsx +++ b/packages/nextjs/components/scaffold-eth/Input/BytesInput.tsx @@ -1,14 +1,10 @@ import { useCallback } from "react"; -import { ethers } from "ethers"; +import { bytesToString, isHex, toBytes, toHex } from "viem"; import { CommonInputProps, InputBase } from "~~/components/scaffold-eth"; export const BytesInput = ({ value, onChange, name, placeholder }: CommonInputProps) => { const convertStringToBytes = useCallback(() => { - onChange( - ethers.utils.isHexString(value) - ? ethers.utils.toUtf8String(value) - : ethers.utils.hexlify(ethers.utils.toUtf8Bytes(value)), - ); + onChange(isHex(value) ? bytesToString(toBytes(value)) : toHex(toBytes(value))); }, [onChange, value]); return ( diff --git a/packages/nextjs/components/scaffold-eth/Input/InputBase.tsx b/packages/nextjs/components/scaffold-eth/Input/InputBase.tsx index edd1391a3..b79b2d7d8 100644 --- a/packages/nextjs/components/scaffold-eth/Input/InputBase.tsx +++ b/packages/nextjs/components/scaffold-eth/Input/InputBase.tsx @@ -8,7 +8,7 @@ type InputBaseProps = CommonInputProps & { suffix?: ReactNode; }; -export const InputBase = string } = string>({ +export const InputBase = string } | undefined = string>({ name, value, onChange, diff --git a/packages/nextjs/components/scaffold-eth/Input/IntegerInput.tsx b/packages/nextjs/components/scaffold-eth/Input/IntegerInput.tsx index 84e72352f..a59cba682 100644 --- a/packages/nextjs/components/scaffold-eth/Input/IntegerInput.tsx +++ b/packages/nextjs/components/scaffold-eth/Input/IntegerInput.tsx @@ -1,8 +1,7 @@ import { useCallback, useEffect, useState } from "react"; -import { BigNumber, ethers } from "ethers"; import { CommonInputProps, InputBase, IntegerVariant, isValidInteger } from "~~/components/scaffold-eth"; -type IntegerInputProps = CommonInputProps & { +type IntegerInputProps = CommonInputProps & { variant?: IntegerVariant; }; @@ -18,7 +17,10 @@ export const IntegerInput = ({ if (!value) { return; } - onChange(ethers.utils.parseEther(value.toString())); + if (typeof value === "bigint") { + return onChange(value * 10n ** 18n); + } + return onChange(BigInt(Math.round(Number(value) * 10 ** 18))); }, [onChange, value]); useEffect(() => { diff --git a/packages/nextjs/components/scaffold-eth/Input/utils.ts b/packages/nextjs/components/scaffold-eth/Input/utils.ts index 724ad7a65..8d6405ca5 100644 --- a/packages/nextjs/components/scaffold-eth/Input/utils.ts +++ b/packages/nextjs/components/scaffold-eth/Input/utils.ts @@ -1,5 +1,3 @@ -import { BigNumber, BigNumberish } from "ethers"; - export interface CommonInputProps { value: T; onChange: (newValue: T) => void; @@ -77,15 +75,15 @@ export enum IntegerVariant { export const SIGNED_NUMBER_REGEX = /^-?\d+\.?\d*$/; export const UNSIGNED_NUMBER_REGEX = /^\.?\d+\.?\d*$/; -export const isValidInteger = (dataType: IntegerVariant, value: BigNumberish, strict = true) => { +export const isValidInteger = (dataType: IntegerVariant, value: bigint | string, strict = true) => { const isSigned = dataType.startsWith("i"); const bitcount = Number(dataType.substring(isSigned ? 3 : 4)); - let valueAsBigNumber; + let valueAsBigInt; try { - valueAsBigNumber = BigNumber.from(value); + valueAsBigInt = BigInt(value); } catch (e) {} - if (!BigNumber.isBigNumber(valueAsBigNumber)) { + if (typeof valueAsBigInt !== "bigint") { if (strict) { return false; } @@ -93,10 +91,10 @@ export const isValidInteger = (dataType: IntegerVariant, value: BigNumberish, st return true; } return isSigned ? SIGNED_NUMBER_REGEX.test(value) || value === "-" : UNSIGNED_NUMBER_REGEX.test(value); - } else if (!isSigned && valueAsBigNumber.isNegative()) { + } else if (!isSigned && valueAsBigInt < 0) { return false; } - const hexString = valueAsBigNumber.toHexString(); + const hexString = valueAsBigInt.toString(16); const significantHexDigits = hexString.match(/.*x0*(.*)$/)?.[1] ?? ""; if ( significantHexDigits.length * 4 > bitcount || diff --git a/packages/nextjs/hooks/scaffold-eth/useAutoConnect.ts b/packages/nextjs/hooks/scaffold-eth/useAutoConnect.ts index 2b8486337..3d1755bbb 100644 --- a/packages/nextjs/hooks/scaffold-eth/useAutoConnect.ts +++ b/packages/nextjs/hooks/scaffold-eth/useAutoConnect.ts @@ -16,7 +16,7 @@ const walletIdStorageKey = "scaffoldEth2.wallet"; */ const getInitialConnector = ( previousWalletId: string, - connectors: Connector[], + connectors: Connector[], ): { connector: Connector | undefined; chainId?: number } | undefined => { const burnerConfig = scaffoldConfig.burnerWallet; const targetNetwork = getTargetNetwork(); diff --git a/packages/nextjs/hooks/scaffold-eth/useBurnerWallet.ts b/packages/nextjs/hooks/scaffold-eth/useBurnerWallet.ts index 18b34441b..47490ed40 100644 --- a/packages/nextjs/hooks/scaffold-eth/useBurnerWallet.ts +++ b/packages/nextjs/hooks/scaffold-eth/useBurnerWallet.ts @@ -1,8 +1,8 @@ -import { useCallback, useEffect, useRef } from "react"; -import { BytesLike, Signer, Wallet, ethers } from "ethers"; -import { useDebounce } from "use-debounce"; +import { useCallback, useEffect, useRef, useState } from "react"; import { useLocalStorage } from "usehooks-ts"; -import { useProvider } from "wagmi"; +import { Hex, HttpTransport, PrivateKeyAccount, createWalletClient, http } from "viem"; +import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; +import { Chain, WalletClient, usePublicClient } from "wagmi"; const burnerStorageKey = "scaffoldEth2.burnerWallet.sk"; @@ -12,14 +12,14 @@ const burnerStorageKey = "scaffoldEth2.burnerWallet.sk"; * @param pk * @returns */ -const isValidSk = (pk: BytesLike | undefined | null): boolean => { +const isValidSk = (pk: Hex | string | undefined | null): boolean => { return pk?.length === 64 || pk?.length === 66; }; /** - * If no burner is found in localstorage, we will use a new default wallet + * If no burner is found in localstorage, we will generate a random private key */ -const newDefaultWallet = ethers.Wallet.createRandom(); +const newDefaultPriaveKey = generatePrivateKey(); /** * Save the current burner private key from storage @@ -27,9 +27,9 @@ const newDefaultWallet = ethers.Wallet.createRandom(); * @internal * @returns */ -export const saveBurnerSK = (wallet: Wallet): void => { +export const saveBurnerSK = (privateKey: Hex): void => { if (typeof window != "undefined" && window != null) { - window?.localStorage?.setItem(burnerStorageKey, wallet.privateKey); + window?.localStorage?.setItem(burnerStorageKey, privateKey); } }; @@ -39,17 +39,17 @@ export const saveBurnerSK = (wallet: Wallet): void => { * @internal * @returns */ -export const loadBurnerSK = (): string => { - let currentSk = ""; +export const loadBurnerSK = (): Hex => { + let currentSk: Hex = "0x"; if (typeof window != "undefined" && window != null) { - currentSk = window?.localStorage?.getItem?.(burnerStorageKey)?.replaceAll('"', "") ?? ""; + currentSk = (window?.localStorage?.getItem?.(burnerStorageKey)?.replaceAll('"', "") ?? "0x") as Hex; } if (!!currentSk && isValidSk(currentSk)) { return currentSk; } else { - saveBurnerSK(newDefaultWallet); - return newDefaultWallet.privateKey; + saveBurnerSK(newDefaultPriaveKey); + return newDefaultPriaveKey; } }; @@ -65,8 +65,8 @@ export const loadBurnerSK = (): string => { * @category Hooks */ export type TBurnerSigner = { - signer: Signer | undefined; - account: string | undefined; + walletClient: WalletClient | undefined; + account: PrivateKeyAccount | undefined; /** * create a new burner signer */ @@ -88,71 +88,89 @@ export type TBurnerSigner = { * @returns IBurnerSigner */ export const useBurnerWallet = (): TBurnerSigner => { - const [burnerSk, setBurnerSk] = useLocalStorage(burnerStorageKey, newDefaultWallet.privateKey); + const [burnerSk, setBurnerSk] = useLocalStorage(burnerStorageKey, newDefaultPriaveKey); - const provider = useProvider(); - const walletRef = useRef(); + const publicClient = usePublicClient(); + const [walletClient, setWalletClient] = useState>(); + const [generatedPrivateKey, setGeneratedPrivateKey] = useState("0x"); + const [account, setAccount] = useState(); const isCreatingNewBurnerRef = useRef(false); - const [signer] = useDebounce(walletRef.current, 200, { - trailing: true, - equalityFn: (a, b) => a?.address === b?.address && a != null && b != null, - }); - const account = walletRef.current?.address; - /** * callback to save current wallet sk */ const saveBurner = useCallback(() => { - setBurnerSk(walletRef.current?.privateKey ?? ""); - }, [setBurnerSk]); + setBurnerSk(generatedPrivateKey); + }, [setBurnerSk, generatedPrivateKey]); /** * create a new burnerkey */ const generateNewBurner = useCallback(() => { - if (provider && !isCreatingNewBurnerRef.current) { + if (publicClient && !isCreatingNewBurnerRef.current) { console.log("🔑 Create new burner wallet..."); isCreatingNewBurnerRef.current = true; - const wallet = Wallet.createRandom().connect(provider); + const randomPrivateKey = generatePrivateKey(); + const randomAccount = privateKeyToAccount(randomPrivateKey); + + const client = createWalletClient({ + chain: publicClient.chain, + account: randomAccount, + transport: http(), + }); + + setWalletClient(client); + setGeneratedPrivateKey(randomPrivateKey); + setAccount(randomAccount); + setBurnerSk(() => { console.log("🔥 ...Save new burner wallet"); isCreatingNewBurnerRef.current = false; - return wallet.privateKey; + return randomPrivateKey; }); - return wallet; + return client; } else { console.log("⚠ Could not create burner wallet"); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [provider?.network?.chainId]); + }, [publicClient.chain.id]); /** * Load wallet with burnerSk * connect and set wallet, once we have burnerSk and valid provider */ useEffect(() => { - if (burnerSk && provider.network.chainId) { - let wallet: Wallet | undefined = undefined; + if (burnerSk && publicClient.chain.id) { + let wallet: WalletClient | undefined = undefined; if (isValidSk(burnerSk)) { - wallet = new ethers.Wallet(burnerSk, provider); + const randomAccount = privateKeyToAccount(burnerSk); + + wallet = createWalletClient({ + chain: publicClient.chain, + account: randomAccount, + transport: http(), + }); + + setGeneratedPrivateKey(burnerSk); + setAccount(randomAccount); } else { - wallet = generateNewBurner?.(); + wallet = generateNewBurner(); } if (wallet == null) { throw "Error: Could not create burner wallet"; } - walletRef.current = wallet; - saveBurner?.(); + + setWalletClient(wallet); + saveBurner(); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [burnerSk, provider?.network?.chainId]); + }, [burnerSk, publicClient.chain.id]); return { - signer, + walletClient, account, generateNewBurner, saveBurner, diff --git a/packages/nextjs/hooks/scaffold-eth/useContractLogs.ts b/packages/nextjs/hooks/scaffold-eth/useContractLogs.ts index d969f6bdc..a5cf7d0a6 100644 --- a/packages/nextjs/hooks/scaffold-eth/useContractLogs.ts +++ b/packages/nextjs/hooks/scaffold-eth/useContractLogs.ts @@ -1,38 +1,37 @@ import { useEffect, useState } from "react"; -import { ethers } from "ethers"; -import { useProvider } from "wagmi"; +import { Address, Log } from "viem"; +import { usePublicClient } from "wagmi"; -export const useContractLogs = (address: string) => { - const [logs, setLogs] = useState([]); - const provider = useProvider(); +export const useContractLogs = (address: Address) => { + const [logs, setLogs] = useState([]); + const client = usePublicClient(); useEffect(() => { const fetchLogs = async () => { try { - const filter = { + const existingLogs = await client.getLogs({ address: address, - fromBlock: 0, + fromBlock: 0n, toBlock: "latest", - }; - const existingLogs = await provider.getLogs(filter); + }); setLogs(existingLogs); } catch (error) { console.error("Failed to fetch logs:", error); } }; - - const handleLog = (log: ethers.providers.Log) => { - setLogs(prevLogs => [...prevLogs, log]); - }; - - const filter = { address: address }; - fetchLogs(); - provider.on(filter, handleLog); - return () => { - provider.off(filter, handleLog); - }; - }, [address, provider]); + + return client.watchBlockNumber({ + onBlockNumber: async (blockNumber, prevBlockNumber) => { + const newLogs = await client.getLogs({ + address: address, + fromBlock: prevBlockNumber, + toBlock: "latest", + }); + setLogs(prevLogs => [...prevLogs, ...newLogs]); + }, + }); + }, [address, client]); return logs; }; diff --git a/packages/nextjs/hooks/scaffold-eth/useDeployedContractInfo.ts b/packages/nextjs/hooks/scaffold-eth/useDeployedContractInfo.ts index f305082ea..869748051 100644 --- a/packages/nextjs/hooks/scaffold-eth/useDeployedContractInfo.ts +++ b/packages/nextjs/hooks/scaffold-eth/useDeployedContractInfo.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from "react"; import { useIsMounted } from "usehooks-ts"; -import { useProvider } from "wagmi"; +import { usePublicClient } from "wagmi"; import scaffoldConfig from "~~/scaffold.config"; import { Contract, ContractCodeStatus, ContractName, contracts } from "~~/utils/scaffold-eth/contract"; @@ -14,7 +14,7 @@ export const useDeployedContractInfo = (cont contractName as ContractName ] as Contract; const [status, setStatus] = useState(ContractCodeStatus.LOADING); - const provider = useProvider({ chainId: scaffoldConfig.targetNetwork.id }); + const publicClient = usePublicClient({ chainId: scaffoldConfig.targetNetwork.id }); useEffect(() => { const checkContractDeployment = async () => { @@ -22,7 +22,9 @@ export const useDeployedContractInfo = (cont setStatus(ContractCodeStatus.NOT_FOUND); return; } - const code = await provider.getCode((deployedContract as Contract).address); + const code = await publicClient.getBytecode({ + address: deployedContract.address, + }); if (!isMounted()) { return; @@ -36,7 +38,7 @@ export const useDeployedContractInfo = (cont }; checkContractDeployment(); - }, [isMounted, contractName, deployedContract, provider]); + }, [isMounted, contractName, deployedContract, publicClient]); return { data: status === ContractCodeStatus.DEPLOYED ? deployedContract : undefined, diff --git a/packages/nextjs/hooks/scaffold-eth/useFetchBlocks.ts b/packages/nextjs/hooks/scaffold-eth/useFetchBlocks.ts index 5ef13fac8..b61c7c8c8 100644 --- a/packages/nextjs/hooks/scaffold-eth/useFetchBlocks.ts +++ b/packages/nextjs/hooks/scaffold-eth/useFetchBlocks.ts @@ -1,21 +1,19 @@ import { useCallback, useEffect, useState } from "react"; -import { ethers } from "ethers"; -import { localhost } from "wagmi/chains"; -import { decodeTransactionData } from "~~/utils/scaffold-eth"; -import { getLocalProvider } from "~~/utils/scaffold-eth"; -import { Block } from "~~/utils/scaffold-eth/block"; +import { Block, Transaction, TransactionReceipt } from "viem"; +import { usePublicClient } from "wagmi"; +import { hardhat } from "wagmi/chains"; const BLOCKS_PER_PAGE = 20; -const provider = getLocalProvider(localhost) || new ethers.providers.JsonRpcProvider("http://localhost:8545"); - export const useFetchBlocks = () => { + const client = usePublicClient({ chainId: hardhat.id }); + const [blocks, setBlocks] = useState([]); const [transactionReceipts, setTransactionReceipts] = useState<{ - [key: string]: ethers.providers.TransactionReceipt; + [key: string]: TransactionReceipt; }>({}); const [currentPage, setCurrentPage] = useState(0); - const [totalBlocks, setTotalBlocks] = useState(0); + const [totalBlocks, setTotalBlocks] = useState(0n); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); @@ -24,18 +22,18 @@ export const useFetchBlocks = () => { setError(null); try { - const blockNumber = await provider.getBlockNumber(); + const blockNumber = await client.getBlockNumber(); setTotalBlocks(blockNumber); - const startingBlock = blockNumber - currentPage * BLOCKS_PER_PAGE; + const startingBlock = blockNumber - BigInt(currentPage * BLOCKS_PER_PAGE); const blockNumbersToFetch = Array.from( - { length: Math.min(BLOCKS_PER_PAGE, startingBlock + 1) }, - (_, i) => startingBlock - i, + { length: Number(BLOCKS_PER_PAGE < startingBlock + 1n ? BLOCKS_PER_PAGE : startingBlock + 1n) }, + (_, i) => startingBlock - BigInt(i), ); const blocksWithTransactions = blockNumbersToFetch.map(async blockNumber => { try { - return provider.getBlockWithTransactions(blockNumber); + return client.getBlock({ blockNumber, includeTransactions: true }); } catch (err) { setError(err instanceof Error ? err : new Error("An error occurred.")); throw err; @@ -43,16 +41,12 @@ export const useFetchBlocks = () => { }); const fetchedBlocks = await Promise.all(blocksWithTransactions); - fetchedBlocks.forEach(block => { - block.transactions.forEach(tx => decodeTransactionData(tx)); - }); - const txReceipts = await Promise.all( fetchedBlocks.flatMap(block => block.transactions.map(async tx => { try { - const receipt = await provider.getTransactionReceipt(tx.hash); - return { [tx.hash]: receipt }; + const receipt = await client.getTransactionReceipt({ hash: (tx as Transaction).hash }); + return { [(tx as Transaction).hash]: receipt }; } catch (err) { setError(err instanceof Error ? err : new Error("An error occurred.")); throw err; @@ -67,27 +61,24 @@ export const useFetchBlocks = () => { setError(err instanceof Error ? err : new Error("An error occurred.")); } setIsLoading(false); - }, [currentPage]); + }, [client, currentPage]); useEffect(() => { fetchBlocks(); }, [fetchBlocks]); useEffect(() => { - const handleNewBlock = async (blockNumber: number) => { + const handleNewBlock = async (newBlock: Block) => { try { - const newBlock = await provider.getBlockWithTransactions(blockNumber); if (!blocks.some(block => block.number === newBlock.number)) { if (currentPage === 0) { setBlocks(prevBlocks => [newBlock, ...prevBlocks.slice(0, BLOCKS_PER_PAGE - 1)]); - newBlock.transactions.forEach(tx => decodeTransactionData(tx)); - const receipts = await Promise.all( newBlock.transactions.map(async tx => { try { - const receipt = await provider.getTransactionReceipt(tx.hash); - return { [tx.hash]: receipt }; + const receipt = await client.getTransactionReceipt({ hash: (tx as Transaction).hash }); + return { [(tx as Transaction).hash]: receipt }; } catch (err) { setError(err instanceof Error ? err : new Error("An error occurred.")); throw err; @@ -97,19 +88,17 @@ export const useFetchBlocks = () => { setTransactionReceipts(prevReceipts => ({ ...prevReceipts, ...Object.assign({}, ...receipts) })); } - setTotalBlocks(blockNumber + 1); + if (newBlock.number) { + setTotalBlocks(newBlock.number); + } } } catch (err) { setError(err instanceof Error ? err : new Error("An error occurred.")); } }; - provider.on("block", handleNewBlock); - - return () => { - provider.off("block", handleNewBlock); - }; - }, [blocks, currentPage]); + return client.watchBlocks({ onBlock: handleNewBlock, includeTransactions: true }); + }, [blocks, client, currentPage]); return { blocks, diff --git a/packages/nextjs/hooks/scaffold-eth/useNativeCurrencyPrice.ts b/packages/nextjs/hooks/scaffold-eth/useNativeCurrencyPrice.ts index ea27785d3..6af4895fb 100644 --- a/packages/nextjs/hooks/scaffold-eth/useNativeCurrencyPrice.ts +++ b/packages/nextjs/hooks/scaffold-eth/useNativeCurrencyPrice.ts @@ -1,6 +1,5 @@ import { useEffect, useState } from "react"; import { useInterval } from "usehooks-ts"; -import { useProvider } from "wagmi"; import scaffoldConfig from "~~/scaffold.config"; import { fetchPriceFromUniswap } from "~~/utils/scaffold-eth"; @@ -11,21 +10,20 @@ const enablePolling = false; * @returns nativeCurrencyPrice: number */ export const useNativeCurrencyPrice = () => { - const provider = useProvider({ chainId: 1 }); const [nativeCurrencyPrice, setNativeCurrencyPrice] = useState(0); // Get the price of ETH from Uniswap on mount useEffect(() => { (async () => { - const price = await fetchPriceFromUniswap(provider); + const price = await fetchPriceFromUniswap(); setNativeCurrencyPrice(price); })(); - }, [provider]); + }, []); // Get the price of ETH from Uniswap at a given interval useInterval( async () => { - const price = await fetchPriceFromUniswap(provider); + const price = await fetchPriceFromUniswap(); setNativeCurrencyPrice(price); }, enablePolling ? scaffoldConfig.pollingInterval : null, diff --git a/packages/nextjs/hooks/scaffold-eth/useScaffoldContract.ts b/packages/nextjs/hooks/scaffold-eth/useScaffoldContract.ts index 4c3edfddb..a634f49a5 100644 --- a/packages/nextjs/hooks/scaffold-eth/useScaffoldContract.ts +++ b/packages/nextjs/hooks/scaffold-eth/useScaffoldContract.ts @@ -1,6 +1,6 @@ import { Abi } from "abitype"; -import { ethers } from "ethers"; -import { useContract, useProvider } from "wagmi"; +import { getContract } from "viem"; +import { GetWalletClientResult } from "wagmi/actions"; import { useDeployedContractInfo } from "~~/hooks/scaffold-eth"; import { ContractName } from "~~/utils/scaffold-eth/contract"; @@ -8,23 +8,28 @@ import { ContractName } from "~~/utils/scaffold-eth/contract"; * Gets a deployed contract by contract name and returns a contract instance * @param config - The config settings * @param config.contractName - Deployed contract name - * @param config.signerOrProvider - An ethers Provider or Signer (optional) + * @param config.walletClient - An viem wallet client instance (optional) */ export const useScaffoldContract = ({ contractName, - signerOrProvider, + walletClient, }: { contractName: TContractName; - signerOrProvider?: ethers.Signer | ethers.providers.Provider; + walletClient?: GetWalletClientResult; }) => { const { data: deployedContractData, isLoading: deployedContractLoading } = useDeployedContractInfo(contractName); - const provider = useProvider(); - const contract = useContract({ - address: deployedContractData?.address, - abi: deployedContractData?.abi as Abi, - signerOrProvider: signerOrProvider === undefined ? provider : signerOrProvider, - }); + // type GetWalletClientResult = WalletClient | null, hence narrowing it to undefined so that it can be passed to getContract + const walletClientInstance = walletClient != null ? walletClient : undefined; + + let contract = undefined; + if (deployedContractData) { + contract = getContract({ + address: deployedContractData.address, + abi: deployedContractData.abi as Abi, + walletClient: walletClientInstance, + }); + } return { data: contract, diff --git a/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts b/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts index 53f7b7cd2..b1b51c290 100644 --- a/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts +++ b/packages/nextjs/hooks/scaffold-eth/useScaffoldContractWrite.ts @@ -1,12 +1,14 @@ import { useState } from "react"; import { Abi, ExtractAbiFunctionNames } from "abitype"; -import { utils } from "ethers"; +import { parseEther } from "viem"; import { useContractWrite, useNetwork } from "wagmi"; -import { getParsedEthersError } from "~~/components/scaffold-eth"; +import { getParsedError } from "~~/components/scaffold-eth"; import { useDeployedContractInfo, useTransactor } from "~~/hooks/scaffold-eth"; import { getTargetNetwork, notification } from "~~/utils/scaffold-eth"; import { ContractAbi, ContractName, UseScaffoldWriteConfig } from "~~/utils/scaffold-eth/contract"; +type UpdatedArgs = Parameters>["writeAsync"]>[0]; + /** * @dev wrapper for wagmi's useContractWrite hook(with config prepared by usePrepareContractWrite hook) which loads in deployed contract abi and address automatically * @param config - The config settings, including extra wagmi configuration @@ -33,31 +35,24 @@ export const useScaffoldContractWrite = < const [isMining, setIsMining] = useState(false); const configuredNetwork = getTargetNetwork(); - const { overrides, ...restConfig } = writeConfig; - const wagmiContractWrite = useContractWrite({ - mode: "recklesslyUnprepared", chainId: configuredNetwork.id, address: deployedContractData?.address, abi: deployedContractData?.abi as Abi, - args: args as unknown[], functionName: functionName as any, - overrides: { - value: value ? utils.parseEther(value) : undefined, - ...overrides, - }, - ...restConfig, + args: args as unknown[], + value: value ? parseEther(value) : undefined, + ...writeConfig, }); const sendContractWriteTx = async ({ - args, - value, - overrides, + args: newArgs, + value: newValue, + ...otherConfig }: { args?: UseScaffoldWriteConfig["args"]; value?: UseScaffoldWriteConfig["value"]; - overrides?: UseScaffoldWriteConfig["overrides"]; - } = {}) => { + } & UpdatedArgs = {}) => { if (!deployedContractData) { notification.error("Target Contract is not deployed, did you forgot to run `yarn deploy`?"); return; @@ -75,21 +70,16 @@ export const useScaffoldContractWrite = < try { setIsMining(true); await writeTx( - wagmiContractWrite.writeAsync({ - recklesslySetUnpreparedArgs: args as unknown[], - recklesslySetUnpreparedOverrides: - value && overrides - ? { value: utils.parseEther(value), ...overrides } - : value - ? { value: utils.parseEther(value) } - : overrides - ? overrides - : undefined, - }), + () => + wagmiContractWrite.writeAsync({ + args: newArgs ?? args, + value: newValue ? parseEther(newValue) : value && parseEther(value), + ...otherConfig, + }), { onBlockConfirmation, blockConfirmations }, ); } catch (e: any) { - const message = getParsedEthersError(e); + const message = getParsedError(e); notification.error(message); } finally { setIsMining(false); diff --git a/packages/nextjs/hooks/scaffold-eth/useScaffoldEventHistory.ts b/packages/nextjs/hooks/scaffold-eth/useScaffoldEventHistory.ts index 39e86231a..a3c61cc62 100644 --- a/packages/nextjs/hooks/scaffold-eth/useScaffoldEventHistory.ts +++ b/packages/nextjs/hooks/scaffold-eth/useScaffoldEventHistory.ts @@ -1,8 +1,9 @@ import { useEffect, useState } from "react"; -import { Abi, ExtractAbiEventNames } from "abitype"; -import { ethers } from "ethers"; -import { useContract, useProvider } from "wagmi"; +import { AbiEvent, ExtractAbiEventNames } from "abitype"; +import { Hash } from "viem"; +import { usePublicClient } from "wagmi"; import { useDeployedContractInfo } from "~~/hooks/scaffold-eth"; +import { replacer } from "~~/utils/scaffold-eth/common"; import { ContractAbi, ContractName, UseScaffoldEventHistoryConfig } from "~~/utils/scaffold-eth/contract"; /** @@ -32,69 +33,43 @@ export const useScaffoldEventHistory = < const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(); const { data: deployedContractData, isLoading: deployedContractLoading } = useDeployedContractInfo(contractName); - const provider = useProvider(); - - const contract = useContract({ - address: deployedContractData?.address, - abi: deployedContractData?.abi as Abi, - signerOrProvider: provider, - }); + const publicClient = usePublicClient(); useEffect(() => { async function readEvents() { try { - if (!deployedContractData || !contract) { + if (!deployedContractData) { throw new Error("Contract not found"); } - const fragment = contract.interface.getEvent(eventName); - const emptyIface = new ethers.utils.Interface([]); - const topicHash = emptyIface.getEventTopic(fragment); - const topics = [topicHash] as any[]; - - const indexedParameters = fragment.inputs.filter(input => input.indexed); - - if (indexedParameters.length > 0 && filters) { - const indexedTopics = indexedParameters.map(input => { - const value = (filters as any)[input.name]; - if (value === undefined) { - return null; - } - if (Array.isArray(value)) { - return value.map(v => ethers.utils.hexZeroPad(ethers.utils.hexlify(v), 32)); - } - return ethers.utils.hexZeroPad(ethers.utils.hexlify(value), 32); - }); - topics.push(...indexedTopics); - } + const event = deployedContractData.abi.find( + part => part.type === "event" && part.name === eventName, + ) as AbiEvent; - const logs = await provider.getLogs({ + const logs = await publicClient.getLogs({ address: deployedContractData?.address, - topics: topics, - fromBlock: fromBlock, + event, + args: filters as any, // TODO: check if it works and fix type + fromBlock, }); const newEvents = []; for (let i = logs.length - 1; i >= 0; i--) { - let block; - if (blockData) { - block = await provider.getBlock(logs[i].blockHash); - } - let transaction; - if (transactionData) { - transaction = await provider.getTransaction(logs[i].transactionHash); - } - let receipt; - if (receiptData) { - receipt = await provider.getTransactionReceipt(logs[i].transactionHash); - } - const log = { + newEvents.push({ log: logs[i], - args: contract.interface.parseLog(logs[i]).args, - block: block, - transaction: transaction, - receipt: receipt, - }; - newEvents.push(log); + args: logs[i].args, + block: + blockData && logs[i].blockHash === null + ? null + : await publicClient.getBlock({ blockHash: logs[i].blockHash as Hash }), + transaction: + transactionData && logs[i].transactionHash !== null + ? await publicClient.getTransaction({ hash: logs[i].transactionHash as Hash }) + : null, + receipt: + receiptData && logs[i].transactionHash !== null + ? await publicClient.getTransactionReceipt({ hash: logs[i].transactionHash as Hash }) + : null, + }); } setEvents(newEvents); setError(undefined); @@ -111,16 +86,15 @@ export const useScaffoldEventHistory = < } // eslint-disable-next-line react-hooks/exhaustive-deps }, [ - provider, + publicClient, fromBlock, contractName, eventName, deployedContractLoading, deployedContractData?.address, - contract, deployedContractData, // eslint-disable-next-line react-hooks/exhaustive-deps - JSON.stringify(filters), + JSON.stringify(filters, replacer), blockData, transactionData, receiptData, diff --git a/packages/nextjs/hooks/scaffold-eth/useScaffoldEventSubscriber.ts b/packages/nextjs/hooks/scaffold-eth/useScaffoldEventSubscriber.ts index b27a7d3cb..928ffda67 100644 --- a/packages/nextjs/hooks/scaffold-eth/useScaffoldEventSubscriber.ts +++ b/packages/nextjs/hooks/scaffold-eth/useScaffoldEventSubscriber.ts @@ -1,35 +1,32 @@ -import { Abi, ExtractAbiEventNames } from "abitype"; +import { ExtractAbiEventNames } from "abitype"; +import { Log } from "viem"; import { useContractEvent } from "wagmi"; import { useDeployedContractInfo } from "~~/hooks/scaffold-eth"; import { getTargetNetwork } from "~~/utils/scaffold-eth"; -import { AbiEventArgs, ContractAbi, ContractName, UseScaffoldEventConfig } from "~~/utils/scaffold-eth/contract"; +import { ContractAbi, ContractName, UseScaffoldEventConfig } from "~~/utils/scaffold-eth/contract"; /** * @dev wrapper for wagmi's useContractEvent * @param config - The config settings * @param config.contractName - deployed contract name * @param config.eventName - name of the event to listen for - * @param config.listener - the callback that receives event - * @param config.once - if set to true it will receive only a single event, then stop listening for the event. Defaults to false + * @param config.listener - the callback that receives events. If only interested in 1 event, call `unwatch` inside of the listener */ export const useScaffoldEventSubscriber = < TContractName extends ContractName, TEventName extends ExtractAbiEventNames>, - TEventInputs extends AbiEventArgs, TEventName> & any[], >({ contractName, eventName, listener, - once, -}: UseScaffoldEventConfig) => { +}: UseScaffoldEventConfig) => { const { data: deployedContractData } = useDeployedContractInfo(contractName); return useContractEvent({ address: deployedContractData?.address, - abi: deployedContractData?.abi as Abi, + abi: deployedContractData?.abi, chainId: getTargetNetwork().id, - listener: listener as (...args: unknown[]) => void, - eventName: eventName as string, - once: once ?? false, + listener: listener as (logs: Log[]) => void, + eventName, }); }; diff --git a/packages/nextjs/hooks/scaffold-eth/useTransactor.tsx b/packages/nextjs/hooks/scaffold-eth/useTransactor.tsx index b1ad8a1a3..7832661c3 100644 --- a/packages/nextjs/hooks/scaffold-eth/useTransactor.tsx +++ b/packages/nextjs/hooks/scaffold-eth/useTransactor.tsx @@ -1,18 +1,16 @@ -import { TransactionReceipt, TransactionRequest, TransactionResponse } from "@ethersproject/abstract-provider"; -import { SendTransactionResult } from "@wagmi/core"; -import { Signer } from "ethers"; -import { Deferrable } from "ethers/lib/utils"; -import { useSigner } from "wagmi"; -import { getParsedEthersError } from "~~/components/scaffold-eth"; +import { WriteContractResult, getPublicClient } from "@wagmi/core"; +import { Hash, SendTransactionParameters, TransactionReceipt, WalletClient } from "viem"; +import { useWalletClient } from "wagmi"; +import { getParsedError } from "~~/components/scaffold-eth"; import { getBlockExplorerTxLink, notification } from "~~/utils/scaffold-eth"; -type TTransactionFunc = ( - tx: Promise | Deferrable | undefined, +type TransactionFunc = ( + tx: (() => Promise) | SendTransactionParameters, options?: { onBlockConfirmation?: (txnReceipt: TransactionReceipt) => void; blockConfirmations?: number; }, -) => Promise | undefined>; +) => Promise; /** * Custom notification content for TXs. @@ -31,48 +29,52 @@ const TxnNotification = ({ message, blockExplorerLink }: { message: string; bloc }; /** - * Runs TXs showing UI feedback. - * @param _signer - * @dev If signer is provided => dev wants to send a raw tx. + * @description Runs Transaction passed in to returned funtion showing UI feedback. + * @param _walletClient + * @returns function that takes a transaction and returns a promise of the transaction hash */ -export const useTransactor = (_signer?: Signer): TTransactionFunc => { - let signer = _signer; - const { data } = useSigner(); - if (signer === undefined && data) { - signer = data; +export const useTransactor = (_walletClient?: WalletClient): TransactionFunc => { + let walletClient = _walletClient; + const { data } = useWalletClient(); + if (walletClient === undefined && data) { + walletClient = data; } - const result: TTransactionFunc = async (tx, options) => { - if (!signer) { - notification.error("Wallet/Signer not connected"); + const result: TransactionFunc = async (tx, options) => { + if (!walletClient) { + notification.error("Cannot access account"); console.error("⚡️ ~ file: useTransactor.tsx ~ error"); return; } let notificationId = null; - let transactionResponse: SendTransactionResult | TransactionResponse | undefined; + let transactionHash: Awaited["hash"] | undefined = undefined; try { - const provider = signer.provider; - const network = await provider?.getNetwork(); + const network = await walletClient.getChainId(); + // Get full transaction from public client + const publicClient = getPublicClient(); notificationId = notification.loading(); - if (tx instanceof Promise) { + if (typeof tx === "function") { // Tx is already prepared by the caller - transactionResponse = await tx; + transactionHash = (await tx()).hash; } else if (tx != null) { - transactionResponse = await signer.sendTransaction(tx); + transactionHash = await walletClient.sendTransaction(tx); } else { throw new Error("Incorrect transaction passed to transactor"); } notification.remove(notificationId); - const blockExplorerTxURL = network ? getBlockExplorerTxLink(network, transactionResponse.hash) : ""; + const blockExplorerTxURL = network ? getBlockExplorerTxLink(network, transactionHash) : ""; notificationId = notification.loading( , ); - const transactionReceipt = await transactionResponse.wait(options?.blockConfirmations); + const transactionReceipt = await publicClient.waitForTransactionReceipt({ + hash: transactionHash, + confirmations: options?.blockConfirmations, + }); notification.remove(notificationId); notification.success( @@ -87,13 +89,12 @@ export const useTransactor = (_signer?: Signer): TTransactionFunc => { if (notificationId) { notification.remove(notificationId); } - // TODO handle error properly console.error("⚡️ ~ file: useTransactor.ts ~ error", error); - const message = getParsedEthersError(error); + const message = getParsedError(error); notification.error(message); } - return transactionResponse; + return transactionHash; }; return result; diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index d3ebc76a6..5b50ede20 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -14,13 +14,12 @@ "vercel:yolo": "vercel --build-env NEXT_PUBLIC_IGNORE_BUILD_ERROR=true" }, "dependencies": { - "@ethersproject/networks": "^5.7.1", - "@ethersproject/web": "^5.7.1", + "@ethersproject/providers": "^5.7.2", "@heroicons/react": "^2.0.11", - "@rainbow-me/rainbowkit": "^0.12.15", - "@uniswap/sdk": "^3.0.3", + "@rainbow-me/rainbowkit": "^1.0.4", + "@uniswap/sdk-core": "^4.0.1", + "@uniswap/v2-sdk": "^3.0.1", "daisyui": "^2.31.0", - "ethers": "^5.0.0", "next": "^13.1.6", "nextjs-progressbar": "^0.0.16", "react": "^18.2.0", @@ -31,7 +30,8 @@ "react-hot-toast": "^2.4.0", "use-debounce": "^8.0.4", "usehooks-ts": "^2.7.2", - "wagmi": "^0.12.15", + "viem": "^1.2.1", + "wagmi": "^1.3.2", "zustand": "^4.1.2" }, "devDependencies": { diff --git a/packages/nextjs/pages/_app.tsx b/packages/nextjs/pages/_app.tsx index c56b69210..70b88958b 100644 --- a/packages/nextjs/pages/_app.tsx +++ b/packages/nextjs/pages/_app.tsx @@ -11,7 +11,7 @@ import { Header } from "~~/components/Header"; import { BlockieAvatar } from "~~/components/scaffold-eth"; import { useNativeCurrencyPrice } from "~~/hooks/scaffold-eth"; import { useGlobalState } from "~~/services/store/store"; -import { wagmiClient } from "~~/services/web3/wagmiClient"; +import { wagmiConfig } from "~~/services/web3/wagmiConfig"; import { appChains } from "~~/services/web3/wagmiConnectors"; import "~~/styles/globals.css"; @@ -33,7 +33,7 @@ const ScaffoldEthApp = ({ Component, pageProps }: AppProps) => { }, [isDarkMode]); return ( - + { const router = useRouter(); @@ -37,17 +40,20 @@ const AddressPage = ({ address, contractData }: PageProps) => { useEffect(() => { const checkIsContract = async () => { - const contractCode = await provider?.getCode(address); - setIsContract(contractCode !== "0x"); + const contractCode = await publicClient.getBytecode({ address: address }); + setIsContract(contractCode !== undefined && contractCode !== "0x"); }; checkIsContract(); }, [address]); const filteredBlocks = blocks.filter(block => - block.transactions.some( - tx => tx.from.toLowerCase() === address.toLowerCase() || tx.to?.toLowerCase() === address.toLowerCase(), - ), + block.transactions.some(tx => { + if (typeof tx === "string") { + return false; + } + return tx.from.toLowerCase() === address.toLowerCase() || tx.to?.toLowerCase() === address.toLowerCase(); + }), ); return ( @@ -103,7 +109,11 @@ const AddressPage = ({ address, contractData }: PageProps) => { {activeTab === "transactions" && (
- +
)} {activeTab === "code" && contractData && ( diff --git a/packages/nextjs/pages/blockexplorer/index.tsx b/packages/nextjs/pages/blockexplorer/index.tsx index bbff977dc..2144a181b 100644 --- a/packages/nextjs/pages/blockexplorer/index.tsx +++ b/packages/nextjs/pages/blockexplorer/index.tsx @@ -52,7 +52,7 @@ const Blockexplorer: NextPage = () => {
- +
); }; diff --git a/packages/nextjs/pages/blockexplorer/transaction/[txHash].tsx b/packages/nextjs/pages/blockexplorer/transaction/[txHash].tsx index 2a21e6250..168af64c0 100644 --- a/packages/nextjs/pages/blockexplorer/transaction/[txHash].tsx +++ b/packages/nextjs/pages/blockexplorer/transaction/[txHash].tsx @@ -1,45 +1,40 @@ import { useEffect, useState } from "react"; import { useRouter } from "next/router"; -import { ethers } from "ethers"; import type { NextPage } from "next"; -import { localhost } from "wagmi/chains"; +import { Transaction, TransactionReceipt, formatEther, formatUnits } from "viem"; +import { usePublicClient } from "wagmi"; +import { hardhat } from "wagmi/chains"; import { Address } from "~~/components/scaffold-eth"; -import { - TransactionWithFunction, - decodeTransactionData, - getFunctionDetails, - getTargetNetwork, -} from "~~/utils/scaffold-eth"; -import { getLocalProvider } from "~~/utils/scaffold-eth"; - -const provider = getLocalProvider(localhost) || new ethers.providers.JsonRpcProvider("http://localhost:8545"); +import { decodeTransactionData, getFunctionDetails, getTargetNetwork } from "~~/utils/scaffold-eth"; const TransactionPage: NextPage = () => { + const client = usePublicClient({ chainId: hardhat.id }); + const router = useRouter(); - const { txHash } = router.query; - const [transaction, setTransaction] = useState(null); - const [receipt, setReceipt] = useState(null); - const [functionCalled, setFunctionCalled] = useState(null); + const { txHash } = router.query as { txHash?: `0x${string}` }; + const [transaction, setTransaction] = useState(); + const [receipt, setReceipt] = useState(); + const [functionCalled, setFunctionCalled] = useState(); const configuredNetwork = getTargetNetwork(); useEffect(() => { if (txHash) { const fetchTransaction = async () => { - const tx = await provider.getTransaction(txHash as string); - const receipt = await provider.getTransactionReceipt(txHash as string); + const tx = await client.getTransaction({ hash: txHash }); + const receipt = await client.getTransactionReceipt({ hash: txHash }); const transactionWithDecodedData = decodeTransactionData(tx); setTransaction(transactionWithDecodedData); setReceipt(receipt); - const functionCalled = transactionWithDecodedData.data.substring(0, 10); + const functionCalled = transactionWithDecodedData.input.substring(0, 10); setFunctionCalled(functionCalled); }; fetchTransaction(); } - }, [txHash]); + }, [client, txHash]); return (
@@ -61,7 +56,7 @@ const TransactionPage: NextPage = () => { Block Number: - {transaction.blockNumber} + {Number(transaction.blockNumber)} @@ -91,7 +86,7 @@ const TransactionPage: NextPage = () => { Value: - {ethers.utils.formatEther(transaction.value)} {configuredNetwork.nativeCurrency.symbol} + {formatEther(transaction.value)} {configuredNetwork.nativeCurrency.symbol} @@ -113,14 +108,14 @@ const TransactionPage: NextPage = () => { Gas Price: - {ethers.utils.formatUnits(transaction.gasPrice || ethers.constants.Zero, "gwei")} Gwei + {formatUnits(transaction.gasPrice || 0n, 9)} Gwei Data: -