From a7fdbf5c0e81d33571fa58f16c47f6268b265201 Mon Sep 17 00:00:00 2001 From: Jeason Date: Mon, 8 Apr 2024 13:38:25 +0800 Subject: [PATCH 1/6] feat(web3js): add web3js sub pkg --- packages/eth-web3js/.fatherrc.ts | 5 + packages/eth-web3js/README.md | 3 + packages/eth-web3js/package.json | 77 +++ packages/eth-web3js/src/global.d.ts | 5 + packages/eth-web3js/src/hooks/index.ts | 2 + .../src/hooks/use-web3js-signer.test.tsx | 23 + .../eth-web3js/src/hooks/use-web3js-signer.ts | 10 + .../eth-web3js/src/hooks/use-web3js.test.tsx | 24 + packages/eth-web3js/src/hooks/use-web3js.ts | 19 + packages/eth-web3js/src/index.ts | 3 + packages/eth-web3js/src/wagmi.ts | 4 + packages/eth-web3js/src/wallets/index.ts | 9 + .../eth-web3js/src/web3js-provider/index.ts | 1 + .../web3js-provider/web3js-provider.test.tsx | 105 +++ .../src/web3js-provider/web3js-provider.tsx | 84 +++ packages/eth-web3js/tsconfig.json | 4 + packages/web3/package.json | 1 + pnpm-lock.yaml | 605 +++++++++++++++++- tsconfig.base.json | 3 +- vitest.config.mts | 2 + 20 files changed, 964 insertions(+), 25 deletions(-) create mode 100644 packages/eth-web3js/.fatherrc.ts create mode 100644 packages/eth-web3js/README.md create mode 100644 packages/eth-web3js/package.json create mode 100644 packages/eth-web3js/src/global.d.ts create mode 100644 packages/eth-web3js/src/hooks/index.ts create mode 100644 packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx create mode 100644 packages/eth-web3js/src/hooks/use-web3js-signer.ts create mode 100644 packages/eth-web3js/src/hooks/use-web3js.test.tsx create mode 100644 packages/eth-web3js/src/hooks/use-web3js.ts create mode 100644 packages/eth-web3js/src/index.ts create mode 100644 packages/eth-web3js/src/wagmi.ts create mode 100644 packages/eth-web3js/src/wallets/index.ts create mode 100644 packages/eth-web3js/src/web3js-provider/index.ts create mode 100644 packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx create mode 100644 packages/eth-web3js/src/web3js-provider/web3js-provider.tsx create mode 100644 packages/eth-web3js/tsconfig.json diff --git a/packages/eth-web3js/.fatherrc.ts b/packages/eth-web3js/.fatherrc.ts new file mode 100644 index 000000000..3305dd5a7 --- /dev/null +++ b/packages/eth-web3js/.fatherrc.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'father'; + +export default defineConfig({ + extends: '../../.fatherrc.base.ts', +}); diff --git a/packages/eth-web3js/README.md b/packages/eth-web3js/README.md new file mode 100644 index 000000000..95f55bfa8 --- /dev/null +++ b/packages/eth-web3js/README.md @@ -0,0 +1,3 @@ +# @ant-design/web3-eth-web3js + +[https://web3.ant.design](https://web3.ant.design) diff --git a/packages/eth-web3js/package.json b/packages/eth-web3js/package.json new file mode 100644 index 000000000..ca5647d14 --- /dev/null +++ b/packages/eth-web3js/package.json @@ -0,0 +1,77 @@ +{ + "name": "@ant-design/web3-eth-web3js", + "version": "0.0.1", + "type": "module", + "main": "dist/esm/index.js", + "module": "dist/esm/index.js", + "typings": "dist/esm/index.d.ts", + "exports": { + ".": { + "import": "./dist/esm/index.js", + "require": "./dist/lib/index.js", + "types": "./dist/esm/index.d.ts" + }, + "./wagmi": { + "import": "./dist/esm/wagmi.js", + "require": "./dist/lib/wagmi.js", + "types": "./dist/esm/wagmi.d.ts" + } + }, + "files": [ + "dist", + "CHANGELOG.md", + "README.md" + ], + "keywords": [ + "ant", + "component", + "components", + "design", + "framework", + "frontend", + "react", + "react-component", + "ui", + "web3js" + ], + "homepage": "https://we3.ant.design", + "bugs": { + "url": "https://github.com/ant-design/ant-design-web3/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/ant-design/ant-design-web3" + }, + "scripts": { + "dev": "father dev", + "build": "father build" + }, + "dependencies": { + "@ant-design/web3-assets": "workspace:*", + "@ant-design/web3-common": "workspace:*", + "@ant-design/web3-wagmi": "workspace:*", + "@tanstack/react-query": "^5.28.4", + "debug": "^4.3.4", + "viem": ">=2.0.0", + "wagmi": "^2.5.7" + }, + "devDependencies": { + "@types/debug": "^4.1.12", + "father": "^4.3.8", + "typescript": "^5.4.2", + "web3": "^4.7.0" + }, + "peerDependencies": { + "web3": "^4.0.0" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org", + "access": "public" + }, + "browserslist": [ + "last 2 versions", + "Firefox ESR", + "> 1%", + "ie >= 11" + ] +} diff --git a/packages/eth-web3js/src/global.d.ts b/packages/eth-web3js/src/global.d.ts new file mode 100644 index 000000000..c36cb9bc7 --- /dev/null +++ b/packages/eth-web3js/src/global.d.ts @@ -0,0 +1,5 @@ +import type { EIP1193Provider } from 'viem'; + +declare interface Window { + ethereum?: EIP1193Provider; +} diff --git a/packages/eth-web3js/src/hooks/index.ts b/packages/eth-web3js/src/hooks/index.ts new file mode 100644 index 000000000..843fd48f9 --- /dev/null +++ b/packages/eth-web3js/src/hooks/index.ts @@ -0,0 +1,2 @@ +export * from './use-web3js'; +export * from './use-web3js-signer'; diff --git a/packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx b/packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx new file mode 100644 index 000000000..0f4935834 --- /dev/null +++ b/packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx @@ -0,0 +1,23 @@ +import { render } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; + +import { Web3jsConfigProvider } from '../web3js-provider'; +import { useWeb3jsSigner } from './use-web3js-signer'; + +describe('useEthersSigner', async () => { + test('basic usage', async () => { + const CustomConnector: React.FC = () => { + const signer = useWeb3jsSigner()!; + return
{signer.defaultAccount}
; + }; + + const App = () => ( + + + + ); + + const { baseElement } = render(); + expect(baseElement.textContent).toBe(''); + }); +}); diff --git a/packages/eth-web3js/src/hooks/use-web3js-signer.ts b/packages/eth-web3js/src/hooks/use-web3js-signer.ts new file mode 100644 index 000000000..8aae2092b --- /dev/null +++ b/packages/eth-web3js/src/hooks/use-web3js-signer.ts @@ -0,0 +1,10 @@ +import { useMemo } from 'react'; +import { useConnectorClient, type Config } from 'wagmi'; +import type Web3 from 'web3'; + +import { clientToWeb3js } from './use-web3js'; + +export function useWeb3jsSigner(): Web3 | null { + const { data: client } = useConnectorClient(); + return useMemo(() => (client ? clientToWeb3js(client) : null), [client]); +} diff --git a/packages/eth-web3js/src/hooks/use-web3js.test.tsx b/packages/eth-web3js/src/hooks/use-web3js.test.tsx new file mode 100644 index 000000000..df7fdd084 --- /dev/null +++ b/packages/eth-web3js/src/hooks/use-web3js.test.tsx @@ -0,0 +1,24 @@ +import { render } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; +import Web3 from 'web3'; + +import { Web3jsConfigProvider } from '../web3js-provider'; +import { useWeb3js } from './use-web3js'; + +describe('useWeb3js', async () => { + test('basic usage', async () => { + const CustomConnector: React.FC = () => { + const web3 = useWeb3js(); + expect(web3).instanceOf(Web3); + return null; + }; + + const App = () => ( + + + + ); + + render(); + }); +}); diff --git a/packages/eth-web3js/src/hooks/use-web3js.ts b/packages/eth-web3js/src/hooks/use-web3js.ts new file mode 100644 index 000000000..546a4ad8b --- /dev/null +++ b/packages/eth-web3js/src/hooks/use-web3js.ts @@ -0,0 +1,19 @@ +import { useMemo } from 'react'; +import type { Chain, Client, Transport } from 'viem'; +import { useClient, type Config } from 'wagmi'; +import { Web3 } from 'web3'; + +export const clientToWeb3js = (client?: Client): Web3 => { + if (!client) return new Web3(); + const { transport } = client; + + if (transport.type === 'fallback') { + return new Web3(transport.transports[0].value.url); + } + return new Web3(transport); +}; + +export function useWeb3js(): Web3 | null { + const client = useClient(); + return useMemo(() => (client ? clientToWeb3js(client) : null), [client]); +} diff --git a/packages/eth-web3js/src/index.ts b/packages/eth-web3js/src/index.ts new file mode 100644 index 000000000..10df5db4b --- /dev/null +++ b/packages/eth-web3js/src/index.ts @@ -0,0 +1,3 @@ +// export * from './ethers-provider'; +// export * from './wallets'; +// export * from './hooks'; diff --git a/packages/eth-web3js/src/wagmi.ts b/packages/eth-web3js/src/wagmi.ts new file mode 100644 index 000000000..7c3d85ee9 --- /dev/null +++ b/packages/eth-web3js/src/wagmi.ts @@ -0,0 +1,4 @@ +export * from 'wagmi'; +export * as actions from 'wagmi/actions'; +export * as chains from 'wagmi/chains'; +export * as connectors from 'wagmi/connectors'; diff --git a/packages/eth-web3js/src/wallets/index.ts b/packages/eth-web3js/src/wallets/index.ts new file mode 100644 index 000000000..95abd2bf3 --- /dev/null +++ b/packages/eth-web3js/src/wallets/index.ts @@ -0,0 +1,9 @@ +export { + MetaMask, + CoinbaseWallet, + TokenPocket, + SafeheronWallet, + UniversalWallet, + OkxWallet, + ImToken, +} from '@ant-design/web3-wagmi'; diff --git a/packages/eth-web3js/src/web3js-provider/index.ts b/packages/eth-web3js/src/web3js-provider/index.ts new file mode 100644 index 000000000..afcc9b011 --- /dev/null +++ b/packages/eth-web3js/src/web3js-provider/index.ts @@ -0,0 +1 @@ +export * from './web3js-provider'; diff --git a/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx b/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx new file mode 100644 index 000000000..649b3ac40 --- /dev/null +++ b/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx @@ -0,0 +1,105 @@ +import React from 'react'; +import { useProvider } from '@ant-design/web3'; +import { Mainnet, Optimism } from '@ant-design/web3-assets'; +import { render } from '@testing-library/react'; +import { describe, expect, test } from 'vitest'; + +import { MetaMask, TokenPocket } from '../wallets'; +import { Web3jsConfigProvider } from './web3js-provider'; + +describe('web3js-provider', async () => { + test('basic usage', async () => { + const CustomConnector: React.FC = () => { + const { availableChains } = useProvider(); + return ( +
{availableChains?.map((item) => item.name).join(',')}
+ ); + }; + + const App = () => ( + + + + ); + + const { baseElement } = render(); + expect(baseElement.querySelector('.chains-name')?.textContent).toBe('Ethereum'); + }); + + test('chains', async () => { + const CustomConnector: React.FC = () => { + const { availableChains } = useProvider(); + return ( +
{availableChains?.map((item) => item.name).join(',')}
+ ); + }; + + const App = () => ( + + + + ); + + const { baseElement } = render(); + expect(baseElement.querySelector('.chains-name')?.textContent).toBe('Ethereum,OP Mainnet'); + }); + + test('chains but not found', async () => { + const CustomConnector: React.FC = () => { + const { availableChains } = useProvider(); + return ( +
{availableChains?.map((item) => item.name).join(',')}
+ ); + }; + + const UnknownChain = { ...Mainnet, name: 'Unknown', id: -9999 }; + + const App = () => ( + + + + ); + + const { baseElement } = render(); + expect(baseElement.querySelector('.chains-name')?.textContent).toBe('Ethereum'); + }); + + test('wallets', async () => { + const CustomConnector: React.FC = () => { + const { availableWallets } = useProvider(); + return ( +
{availableWallets?.map((item) => item.name).join(',')}
+ ); + }; + + const App = () => ( + + + + ); + + const { baseElement } = render(); + expect(baseElement.querySelector('.wallets-name')?.textContent).toBe('MetaMask,TokenPocket'); + }); + + test('wallet-connect', async () => { + const CustomConnector: React.FC = () => { + const { availableWallets } = useProvider(); + return ( +
{availableWallets?.map((item) => item.name).join(',')}
+ ); + }; + + const App = () => ( + + + + ); + + const { baseElement } = render(); + expect(baseElement.querySelector('.wallets-name')?.textContent).toBe('MetaMask,WalletConnect'); + }); +}); diff --git a/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx b/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx new file mode 100644 index 000000000..44b9181fb --- /dev/null +++ b/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx @@ -0,0 +1,84 @@ +import React from 'react'; +import { + Mainnet, + WagmiWeb3ConfigProvider, + WalletConnect, + type WagmiWeb3ConfigProviderProps, +} from '@ant-design/web3-wagmi'; +import type { Chain } from 'viem'; +import { createConfig, http, type CreateConfigParameters } from 'wagmi'; +import * as wagmiChains from 'wagmi/chains'; +import * as wagmiConnectors from 'wagmi/connectors'; +import type { WalletConnectParameters } from 'wagmi/connectors'; + +export interface WalletConnectOptions + extends Pick< + WalletConnectParameters, + | 'disableProviderPing' + | 'isNewChainsStale' + | 'projectId' + | 'metadata' + | 'relayUrl' + | 'storageOptions' + | 'qrModalOptions' + > { + useWalletConnectOfficialModal?: boolean; +} + +export interface Web3jsConfigProviderProps extends Omit { + walletConnect?: false | WalletConnectOptions; +} + +export const Web3jsConfigProvider: React.FC> = ({ + children, + walletConnect, + ...props +}) => { + const chains = React.useMemo( + () => + (props.chains ?? [Mainnet]) + .map((chain) => { + const wagmiChain = Object.values(wagmiChains).find((wc) => wc.id === chain.id) ?? null; + if (!wagmiChain?.id) console.warn(`Chain ${chain.id} is not supported`); + return wagmiChain; + }) + .filter((chain) => chain !== null) as unknown as readonly [Chain, ...Chain[]], + + // only check chains id + // eslint-disable-next-line react-hooks/exhaustive-deps + [props.chains?.map((chain) => chain.id).join()], + ); + + const wallets = React.useMemo(() => { + const targetWallets = [...(props.wallets ?? [])]; + if (walletConnect && walletConnect.projectId) targetWallets.push(WalletConnect()); + return targetWallets; + }, [props.wallets, walletConnect]); + + const wagmiConfig = React.useMemo(() => { + const transports = Object.fromEntries(chains.map((chain) => [chain.id, http()])); + const connectors: CreateConfigParameters['connectors'] = [wagmiConnectors.injected()]; + + (props.wallets ?? []).forEach((wallet) => { + if (wallet.name) { + connectors.push(wagmiConnectors.injected({ target: wallet.name as any })); + } + }); + + if (walletConnect && walletConnect.projectId) { + connectors.push( + wagmiConnectors.walletConnect({ + ...walletConnect, + showQrModal: walletConnect.useWalletConnectOfficialModal ?? false, + }), + ); + } + return createConfig({ chains, transports, connectors }); + }, [chains, walletConnect, props.wallets]); + + return ( + + {children} + + ); +}; diff --git a/packages/eth-web3js/tsconfig.json b/packages/eth-web3js/tsconfig.json new file mode 100644 index 000000000..928e5b0ef --- /dev/null +++ b/packages/eth-web3js/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src", "global.d.ts"] +} diff --git a/packages/web3/package.json b/packages/web3/package.json index 8f1d29a79..a57729d50 100644 --- a/packages/web3/package.json +++ b/packages/web3/package.json @@ -55,6 +55,7 @@ "@ant-design/web3-solana": "workspace:*", "@ant-design/web3-wagmi": "workspace:*", "@ant-design/web3-ethers": "workspace:*", + "@ant-design/web3-eth-web3js": "workspace:*", "@types/react": "^18.2.73", "@types/react-dom": "^18.2.23", "father": "^4.3.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c120379b..2ebbdfc28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,6 +290,43 @@ importers: specifier: ^5.4.2 version: 5.4.2 + packages/eth-web3js: + dependencies: + '@ant-design/web3-assets': + specifier: workspace:* + version: link:../assets + '@ant-design/web3-common': + specifier: workspace:* + version: link:../common + '@ant-design/web3-wagmi': + specifier: workspace:* + version: link:../wagmi + '@tanstack/react-query': + specifier: ^5.28.4 + version: 5.28.4(react@18.2.0) + debug: + specifier: ^4.3.4 + version: 4.3.4(supports-color@5.5.0) + viem: + specifier: '>=2.0.0' + version: 2.0.0(typescript@5.4.3) + wagmi: + specifier: ^2.5.7 + version: 2.5.7(@tanstack/react-query@5.28.4)(@types/react@18.2.73)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0) + devDependencies: + '@types/debug': + specifier: ^4.1.12 + version: 4.1.12 + father: + specifier: ^4.3.8 + version: 4.3.8(@types/node@20.10.5)(webpack@5.91.0) + typescript: + specifier: ^5.4.2 + version: 5.4.3 + web3: + specifier: ^4.7.0 + version: 4.7.0(typescript@5.4.3) + packages/ethers: dependencies: '@ant-design/web3-assets': @@ -495,6 +532,9 @@ importers: specifier: '>=17.0.0' version: 18.2.0(react@18.2.0) devDependencies: + '@ant-design/web3-eth-web3js': + specifier: workspace:* + version: link:../eth-web3js '@ant-design/web3-ethers': specifier: workspace:* version: link:../ethers @@ -876,7 +916,7 @@ packages: dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 + browserslist: 4.23.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -7627,6 +7667,18 @@ packages: - utf-8-validate - zod + /@safe-global/safe-apps-provider@0.18.1(typescript@5.4.3): + resolution: {integrity: sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg==} + dependencies: + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.4.3) + events: 3.3.0 + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.4.2): resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} dependencies: @@ -7638,6 +7690,18 @@ packages: - utf-8-validate - zod + /@safe-global/safe-apps-sdk@8.1.0(typescript@5.4.3): + resolution: {integrity: sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w==} + dependencies: + '@safe-global/safe-gateway-typescript-sdk': 3.13.3 + viem: 1.20.3(typescript@5.4.3) + transitivePeerDependencies: + - bufferutil + - typescript + - utf-8-validate + - zod + dev: false + /@safe-global/safe-gateway-typescript-sdk@3.13.3: resolution: {integrity: sha512-qBDM469cVCedpBpeTSn+k5FUr9+rq5bMTflp/mKd7h35uafcexvOR/PHZn2qftqV8b1kc9b8t22cPRJ2365jew==} engines: {node: '>=16'} @@ -10532,6 +10596,12 @@ packages: dependencies: '@types/node': 20.10.5 + /@types/ws@8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + dependencies: + '@types/node': 20.10.5 + dev: true + /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -10824,7 +10894,6 @@ packages: core-js: 3.34.0 transitivePeerDependencies: - supports-color - dev: false /@umijs/bundler-esbuild@4.0.90: resolution: {integrity: sha512-qTC1jkvlFyAyBYvWVVtpHl/RY6jwAeVYppR3eg8lD5HDB5+JK4fsR+waPDjXz56KJfFr+T9+jT4I9LcbbQjKiw==} @@ -10852,7 +10921,6 @@ packages: postcss-preset-env: 7.5.0(postcss@8.4.32) transitivePeerDependencies: - supports-color - dev: false /@umijs/bundler-utils@4.0.90: resolution: {integrity: sha512-BMdKGrBLF1ReQYxgJ4egJppVr8ZiP3yoolsKLZg5KmttcuFmOJLGJ/2FXzMM9KbtKfKDDnCINi25STWtWJyF9A==} @@ -10876,7 +10944,6 @@ packages: spdy: 4.0.2 transitivePeerDependencies: - supports-color - dev: false /@umijs/bundler-vite@4.0.90(@types/node@20.10.5)(postcss@8.4.32)(sass@1.69.5): resolution: {integrity: sha512-Z4O+BhsmHmFKBgSJcQGy+6wyVDYMDtpBD37l5wI2xjEHkHwSiwLf9VCt1oUEwT+yv1mTaBfq8bUjconTFL/ydA==} @@ -10929,7 +10996,7 @@ packages: - terser dev: false - /@umijs/bundler-webpack@4.0.90(typescript@5.0.4)(webpack@5.91.0): + /@umijs/bundler-webpack@4.0.90(typescript@5.4.2)(webpack@5.91.0): resolution: {integrity: sha512-8m8SD7hduEPQXsMmhU/QtvcAJQBhAmhhMjyCVCd6OSTryd2/kz9EeVjVUSQdKuuHdGzCBKfbB23lnMvu2loTyg==} hasBin: true dependencies: @@ -10946,7 +11013,7 @@ packages: cors: 2.8.5 css-loader: 6.7.1(webpack@5.91.0) es5-imcompatible-versions: 0.1.88 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.0.4)(webpack@5.91.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.4.2)(webpack@5.91.0) jest-worker: 29.4.3 lightningcss: 1.22.1 node-libs-browser: 2.2.1 @@ -10966,24 +11033,24 @@ packages: - webpack-plugin-serve dev: true - /@umijs/bundler-webpack@4.0.90(typescript@5.4.2)(webpack@5.91.0): - resolution: {integrity: sha512-8m8SD7hduEPQXsMmhU/QtvcAJQBhAmhhMjyCVCd6OSTryd2/kz9EeVjVUSQdKuuHdGzCBKfbB23lnMvu2loTyg==} + /@umijs/bundler-webpack@4.1.5(typescript@5.0.4)(webpack@5.91.0): + resolution: {integrity: sha512-4/WmKhsaTnScUtU4HiZpUAf1qKTZGBWo6dKcT5lNw+ubXk13+Yq27Dor8J9Pi8JdYwykeMBUEeaJCo9V7hStXQ==} hasBin: true dependencies: '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) '@types/hapi__joi': 17.1.9 - '@umijs/babel-preset-umi': 4.0.90 - '@umijs/bundler-utils': 4.0.90 + '@umijs/babel-preset-umi': 4.1.5 + '@umijs/bundler-utils': 4.1.5 '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/mfsu': 4.0.90 + '@umijs/mfsu': 4.1.5 '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(webpack@5.91.0) - '@umijs/utils': 4.0.90 + '@umijs/utils': 4.1.5 cors: 2.8.5 css-loader: 6.7.1(webpack@5.91.0) es5-imcompatible-versions: 0.1.88 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.4.2)(webpack@5.91.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.0.4)(webpack@5.91.0) jest-worker: 29.4.3 lightningcss: 1.22.1 node-libs-browser: 2.2.1 @@ -11059,7 +11126,6 @@ packages: '@umijs/utils': 4.1.5 transitivePeerDependencies: - supports-color - dev: false /@umijs/did-you-know@1.0.3: resolution: {integrity: sha512-9EZ+rgY9+2HEaE+Z9dGkal2ccw8L4uuz77tCB5WpskW7NBZX5nOj82sqF/shEtA5tU3SWO/Mi4n35K3iONvDtw==} @@ -11276,7 +11342,6 @@ packages: is-equal: 1.7.0 transitivePeerDependencies: - supports-color - dev: false /@umijs/plugin-run@4.0.90: resolution: {integrity: sha512-/OoJkZkdfuHvVxXoxa/MMyHa7lVLuy6txFccY32V9wKPqPjnPiSkYZrnhZTykMyEmKXbXTX2yqqhyY91gSTgRA==} @@ -11574,7 +11639,6 @@ packages: dependencies: chokidar: 3.5.3 pino: 7.11.0 - dev: false /@umijs/zod2ts@4.0.90: resolution: {integrity: sha512-W2L6Sp/aSYDnWwNICgwACzxmkX0WcpHW3zUIwCqEfcj8EhuWoB8E79bP7ENoVeFgjEh+u4SR7C+7T27I3ngq+g==} @@ -11745,6 +11809,50 @@ packages: - utf-8-validate - zod + /@wagmi/connectors@4.1.14(@types/react@18.2.73)(@wagmi/core@2.6.5)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0): + resolution: {integrity: sha512-e8I89FsNBtzhIilU3nqmgMR9xvSgCfmkWLz9iCKBTqyitbK5EJU7WTEtjjYFm1v2J//JeAwaA2XEKtG9BLR9jQ==} + peerDependencies: + '@wagmi/core': 2.6.5 + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@coinbase/wallet-sdk': 3.9.1 + '@metamask/sdk': 0.14.3(@types/react@18.2.73)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0) + '@safe-global/safe-apps-provider': 0.18.1(typescript@5.4.3) + '@safe-global/safe-apps-sdk': 8.1.0(typescript@5.4.3) + '@wagmi/core': 2.6.5(@types/react@18.2.73)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0) + '@walletconnect/ethereum-provider': 2.11.1(@types/react@18.2.73)(react@18.2.0) + '@walletconnect/modal': 2.6.2(@types/react@18.2.73)(react@18.2.0) + typescript: 5.4.3 + viem: 2.0.0(typescript@5.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - react + - react-dom + - react-native + - rollup + - supports-color + - utf-8-validate + - zod + dev: false + /@wagmi/core@2.6.5(@types/react@18.2.73)(react@18.2.0)(typescript@5.4.2)(viem@2.0.0): resolution: {integrity: sha512-DLyrc0o+dx05oIhBJuxnS7ekS5e6rB5mytlqPme+Km7aLdeBdcfYB4yJyYCyWoi93OLa7M5sbflTttz3o56bKw==} peerDependencies: @@ -11770,6 +11878,32 @@ packages: - utf-8-validate - zod + /@wagmi/core@2.6.5(@types/react@18.2.73)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0): + resolution: {integrity: sha512-DLyrc0o+dx05oIhBJuxnS7ekS5e6rB5mytlqPme+Km7aLdeBdcfYB4yJyYCyWoi93OLa7M5sbflTttz3o56bKw==} + peerDependencies: + '@tanstack/query-core': '>=5.0.0' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + '@tanstack/query-core': + optional: true + typescript: + optional: true + dependencies: + eventemitter3: 5.0.1 + mipd: 0.0.5(typescript@5.4.3) + typescript: 5.4.3 + viem: 2.0.0(typescript@5.4.3) + zustand: 4.4.1(@types/react@18.2.73)(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - utf-8-validate + - zod + dev: false + /@wallet-standard/app@1.0.1: resolution: {integrity: sha512-LnLYq2Vy2guTZ8GQKKSXQK3+FRGPil75XEdkZqE6fiLixJhZJoJa5hT7lXxwe0ykVTt9LEThdTbOpT7KadS26Q==} engines: {node: '>=16'} @@ -12793,6 +12927,32 @@ packages: dependencies: typescript: 5.4.2 + /abitype@0.10.0(typescript@5.4.3): + resolution: {integrity: sha512-QvMHEUzgI9nPj9TWtUGnS2scas80/qaL5PBxGdwWhhvzqXfOph+IEiiiWrzuisu3U3JgDQVruW9oLbJoQ3oZ3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.4.3 + dev: false + + /abitype@0.7.1(typescript@5.4.3): + resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} + peerDependencies: + typescript: '>=4.9.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + zod: + optional: true + dependencies: + typescript: 5.4.3 + dev: true + /abitype@0.9.8(typescript@5.4.2): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} peerDependencies: @@ -12806,6 +12966,20 @@ packages: dependencies: typescript: 5.4.2 + /abitype@0.9.8(typescript@5.4.3): + resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.19.1 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.4.3 + dev: false + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -14990,7 +15164,6 @@ packages: /core-js@3.34.0: resolution: {integrity: sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==} requiresBuild: true - dev: false /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -16138,6 +16311,7 @@ packages: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true /enhanced-resolve@5.16.0: resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} @@ -17180,12 +17354,12 @@ packages: hasBin: true dependencies: '@microsoft/api-extractor': 7.36.3(@types/node@20.10.5) - '@umijs/babel-preset-umi': 4.0.90 - '@umijs/bundler-utils': 4.0.90 - '@umijs/bundler-webpack': 4.0.90(typescript@5.0.4)(webpack@5.91.0) + '@umijs/babel-preset-umi': 4.1.5 + '@umijs/bundler-utils': 4.1.5 + '@umijs/bundler-webpack': 4.1.5(typescript@5.0.4)(webpack@5.91.0) '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/core': 4.0.90 - '@umijs/utils': 4.0.90 + '@umijs/core': 4.1.5 + '@umijs/utils': 4.1.5 '@vercel/ncc': 0.33.3 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-module-resolver: 4.1.0 @@ -19288,6 +19462,14 @@ packages: dependencies: ws: 7.5.9 + /isomorphic-ws@5.0.0(ws@8.16.0): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + dev: true + /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} peerDependencies: @@ -19839,7 +20021,7 @@ packages: /less-plugin-resolve@1.0.2: resolution: {integrity: sha512-e1AHq0XNTU8S3d9JCc8CFYajoUBr0EK3pcuLT5PogyBBeE0knzZJL105kKKSZWfq2lQLq3/uEDrMK3JPq+fHaA==} dependencies: - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.16.0 /less@4.1.3: resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} @@ -21339,6 +21521,22 @@ packages: - utf-8-validate - zod + /mipd@0.0.5(typescript@5.4.3): + resolution: {integrity: sha512-gbKA784D2WKb5H/GtqEv+Ofd1S9Zj+Z/PGDIl1u1QAbswkxD28BQ5bSXQxkeBzPBABg1iDSbiwGG1XqlOxRspA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.4.3 + viem: 1.20.3(typescript@5.4.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + /mississippi@1.3.1: resolution: {integrity: sha512-/6rB8YXFbAtsUVRphIRQqB0+9c7VaPHCjVtvto+JqwVxgz8Zz+I+f68/JgQ+Pb4VlZb2svA9OtdXnHHsZz7ltg==} dependencies: @@ -22755,7 +22953,7 @@ packages: '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.32) '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.32) autoprefixer: 10.4.16(postcss@8.4.32) - browserslist: 4.22.2 + browserslist: 4.23.0 css-blank-pseudo: 3.0.3(postcss@8.4.32) css-has-pseudo: 3.0.4(postcss@8.4.32) css-prefers-color-scheme: 6.0.3(postcss@8.4.32) @@ -27497,6 +27695,29 @@ packages: - utf-8-validate - zod + /viem@1.20.3(typescript@5.4.3): + resolution: {integrity: sha512-7CrmeCb2KYkeCgUmUyb1hsf+IX/PLwi+Np+Vm4YUTPeG82y3HRSgGHSaCOp3d0YtR2kXD3nv9y5kE7LBFE+wWw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.9.8(typescript@5.4.3) + isows: 1.0.3(ws@8.13.0) + typescript: 5.4.3 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + /viem@2.0.0(typescript@5.4.2): resolution: {integrity: sha512-WYPwVAs/wrQE1Li9mgHMZaZTnRZuyPJMauIhnpZKeZgtx7f+bWU3uvVSR5kxTf1aBFdaTuRc/umzX2ucQUurnA==} peerDependencies: @@ -27519,6 +27740,29 @@ packages: - utf-8-validate - zod + /viem@2.0.0(typescript@5.4.3): + resolution: {integrity: sha512-WYPwVAs/wrQE1Li9mgHMZaZTnRZuyPJMauIhnpZKeZgtx7f+bWU3uvVSR5kxTf1aBFdaTuRc/umzX2ucQUurnA==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 0.10.0(typescript@5.4.3) + isows: 1.0.3(ws@8.13.0) + typescript: 5.4.3 + ws: 8.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + dev: false + /vite-node@1.4.0(@types/node@20.10.5): resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} @@ -27784,6 +28028,50 @@ packages: - utf-8-validate - zod + /wagmi@2.5.7(@tanstack/react-query@5.28.4)(@types/react@18.2.73)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0): + resolution: {integrity: sha512-xSuteMXFKvra4xDddqZbZv/gQlcg3X+To5AoZW7WoAm0iVlF8/vEGpQzCWy6KZs2z1szxPrr0YnH3Zr1Qj4E/A==} + peerDependencies: + '@tanstack/react-query': '>=5.0.0' + react: '>=18' + typescript: '>=5.0.4' + viem: 2.x + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@tanstack/react-query': 5.28.4(react@18.2.0) + '@wagmi/connectors': 4.1.14(@types/react@18.2.73)(@wagmi/core@2.6.5)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0) + '@wagmi/core': 2.6.5(@types/react@18.2.73)(react@18.2.0)(typescript@5.4.3)(viem@2.0.0) + react: 18.2.0 + typescript: 5.4.3 + use-sync-external-store: 1.2.0(react@18.2.0) + viem: 2.0.0(typescript@5.4.3) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@tanstack/query-core' + - '@types/react' + - '@upstash/redis' + - '@vercel/kv' + - bufferutil + - encoding + - immer + - react-dom + - react-native + - rollup + - supports-color + - utf-8-validate + - zod + dev: false + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -27819,6 +28107,221 @@ packages: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} + /web3-core@4.3.2: + resolution: {integrity: sha512-uIMVd/j4BgOnwfpY8ZT+QKubOyM4xohEhFZXz9xB8wimXWMMlYVlIK/TbfHqFolS9uOerdSGhsMbcK9lETae8g==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-errors: 1.1.4 + web3-eth-accounts: 4.1.1 + web3-eth-iban: 4.0.7 + web3-providers-http: 4.1.0 + web3-providers-ws: 4.0.7 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + optionalDependencies: + web3-providers-ipc: 4.0.7 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: true + + /web3-errors@1.1.4: + resolution: {integrity: sha512-WahtszSqILez+83AxGecVroyZsMuuRT+KmQp4Si5P4Rnqbczno1k748PCrZTS1J4UCPmXMG2/Vt+0Bz2zwXkwQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-types: 1.5.0 + dev: true + + /web3-eth-abi@4.2.0(typescript@5.4.3): + resolution: {integrity: sha512-x7dUCmk6th+5N63s5kUusoNtsDJKUUQgl9+jECvGTBOTiyHe/V6aOY0120FUjaAGaapOnR7BImQdhqHv6yT2YQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + abitype: 0.7.1(typescript@5.4.3) + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + transitivePeerDependencies: + - typescript + - zod + dev: true + + /web3-eth-accounts@4.1.1: + resolution: {integrity: sha512-9JqhRi1YhO1hQOEmmBHgEGsME/B1FHMxpA/AK3vhpvQ8QeP6KbJW+cForTLfPpUbkmPxnRunG4PNNaETNlZfrA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + crc-32: 1.2.2 + ethereum-cryptography: 2.1.3 + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + dev: true + + /web3-eth-contract@4.3.0(typescript@5.4.3): + resolution: {integrity: sha512-4fzSklA65zUn6SthU3T3tbVJacfP8/wkJmCuvmPaf2ZTFdnhsF96G5IQtCRf0+wASb4yk0A6IBvXZfk1B4R4HA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.2 + web3-errors: 1.1.4 + web3-eth: 4.5.0(typescript@5.4.3) + web3-eth-abi: 4.2.0(typescript@5.4.3) + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-eth-ens@4.2.0(typescript@5.4.3): + resolution: {integrity: sha512-qYj34te2UctoObt8rlEIY/t2MuTMiMiiHhO2JAHRGqSLCQ7b8DM3RpvkiiSB0N0ZyEn+CetZqJCTYb8DNKBS/g==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.1 + web3-core: 4.3.2 + web3-errors: 1.1.4 + web3-eth: 4.5.0(typescript@5.4.3) + web3-eth-contract: 4.3.0(typescript@5.4.3) + web3-net: 4.0.7 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-eth-iban@4.0.7: + resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + dev: true + + /web3-eth-personal@4.0.8(typescript@5.4.3): + resolution: {integrity: sha512-sXeyLKJ7ddQdMxz1BZkAwImjqh7OmKxhXoBNF3isDmD4QDpMIwv/t237S3q4Z0sZQamPa/pHebJRWVuvP8jZdw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.2 + web3-eth: 4.5.0(typescript@5.4.3) + web3-rpc-methods: 1.2.0 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-eth@4.5.0(typescript@5.4.3): + resolution: {integrity: sha512-crisE46o/SHMVm+XHAXEaR8k76NCImq+hi0QQEJ+VaLZbDobI/Gvog1HwTukDUDRgnYSAFGqD0cTRyAwDurwpA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + setimmediate: 1.0.5 + web3-core: 4.3.2 + web3-errors: 1.1.4 + web3-eth-abi: 4.2.0(typescript@5.4.3) + web3-eth-accounts: 4.1.1 + web3-net: 4.0.7 + web3-providers-ws: 4.0.7 + web3-rpc-methods: 1.2.0 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + + /web3-net@4.0.7: + resolution: {integrity: sha512-SzEaXFrBjY25iQGk5myaOfO9ZyfTwQEa4l4Ps4HDNVMibgZji3WPzpjq8zomVHMwi8bRp6VV7YS71eEsX7zLow==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.2 + web3-rpc-methods: 1.2.0 + web3-types: 1.5.0 + web3-utils: 4.2.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: true + + /web3-providers-http@4.1.0: + resolution: {integrity: sha512-6qRUGAhJfVQM41E5t+re5IHYmb5hSaLc02BE2MaRQsz2xKA6RjmHpOA5h/+ojJxEpI9NI2CrfDKOAgtJfoUJQg==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + cross-fetch: 4.0.0 + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-utils: 4.2.2 + transitivePeerDependencies: + - encoding + dev: true + + /web3-providers-ipc@4.0.7: + resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} + engines: {node: '>=14', npm: '>=6.12.0'} + requiresBuild: true + dependencies: + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-utils: 4.2.2 + dev: true + optional: true + + /web3-providers-ws@4.0.7: + resolution: {integrity: sha512-n4Dal9/rQWjS7d6LjyEPM2R458V8blRm0eLJupDEJOOIBhGYlxw5/4FthZZ/cqB7y/sLVi7K09DdYx2MeRtU5w==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@types/ws': 8.5.3 + isomorphic-ws: 5.0.0(ws@8.16.0) + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-utils: 4.2.2 + ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /web3-rpc-methods@1.2.0: + resolution: {integrity: sha512-CWJ/g4I4WyYvLkf21wCZAehdhU/VjX/OAPHnqF5/FPDJlogOsOnGXHqi1Z5AP+ocdt395PNubd8jyMMJoYGSBA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.2 + web3-types: 1.5.0 + web3-validator: 2.0.5 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: true + + /web3-types@1.5.0: + resolution: {integrity: sha512-geWuMIeegQ8AedKAO6wO4G4j1gyQ1F/AyKLMw2vud4bsfZayyzWJgCMDZtjYMm5uo2a7i8j1W3/4QFmzlSy5cw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dev: true + /web3-utils@1.10.3: resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} engines: {node: '>=8.0.0'} @@ -27833,6 +28336,56 @@ packages: utf8: 3.0.0 dev: false + /web3-utils@4.2.2: + resolution: {integrity: sha512-z+4owWcnoB4EH8yWIL1FBeyqe+sXwaGxUDtVTNPTMf2oB5C+paCToZUdCV5Bi+M543zZEzlzNTabOD+OWNc7NA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + ethereum-cryptography: 2.1.3 + eventemitter3: 5.0.1 + web3-errors: 1.1.4 + web3-types: 1.5.0 + web3-validator: 2.0.5 + dev: true + + /web3-validator@2.0.5: + resolution: {integrity: sha512-2gLOSW8XqEN5pw5jVUm20EB7A8SbQiekpAtiI0JBmCIV0a2rp97v8FgWY5E3UEqnw5WFfEqvcDVW92EyynDTyQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + ethereum-cryptography: 2.1.3 + util: 0.12.5 + web3-errors: 1.1.4 + web3-types: 1.5.0 + zod: 3.22.4 + dev: true + + /web3@4.7.0(typescript@5.4.3): + resolution: {integrity: sha512-3g+1e7B/IW0Nw9WP1dotrZKWD9o5IBfl27dxEnE1LxBZBax6ZkviiAwf18utIhlNBD07RgI+PPfKDXxfDBlHWA==} + engines: {node: '>=14.0.0', npm: '>=6.12.0'} + dependencies: + web3-core: 4.3.2 + web3-errors: 1.1.4 + web3-eth: 4.5.0(typescript@5.4.3) + web3-eth-abi: 4.2.0(typescript@5.4.3) + web3-eth-accounts: 4.1.1 + web3-eth-contract: 4.3.0(typescript@5.4.3) + web3-eth-ens: 4.2.0(typescript@5.4.3) + web3-eth-iban: 4.0.7 + web3-eth-personal: 4.0.8(typescript@5.4.3) + web3-net: 4.0.7 + web3-providers-http: 4.1.0 + web3-providers-ws: 4.0.7 + web3-rpc-methods: 1.2.0 + web3-types: 1.5.0 + web3-utils: 4.2.2 + web3-validator: 2.0.5 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + - zod + dev: true + /webextension-polyfill-ts@0.25.0: resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} deprecated: This project has moved to @types/webextension-polyfill @@ -28380,6 +28933,10 @@ packages: commander: 9.5.0 dev: true + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: true + /zustand@4.4.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} engines: {node: '>=12.7.0'} diff --git a/tsconfig.base.json b/tsconfig.base.json index d90060928..4f8114108 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -23,7 +23,8 @@ "@ant-design/web3-ethers": ["./packages/ethers/src/"], "@ant-design/web3-ethers/legacy-v5": ["./packages/ethers/src/index-v5.ts"], "@ant-design/web3-ethers/wagmi": ["./packages/ethers/src/wagmi.ts"], - "@ant-design/web3-solana": ["./packages/solana/src/"] + "@ant-design/web3-solana": ["./packages/solana/src/"], + "@ant-design/web3-eth-web3js": ["./packages/eth-web3js/src/"] } } } diff --git a/vitest.config.mts b/vitest.config.mts index 65fbf5fb5..3e806b340 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -26,6 +26,7 @@ export default defineConfig({ '@ant-design/web3-wagmi': resolve('./packages/wagmi/dist/esm/index'), '@ant-design/web3-ethers': resolve('./packages/ethers/dist/esm/index'), '@ant-design/web3-solana': resolve('./packages/solana/dist/esm/index'), + '@ant-design/web3-eth-web3js': resolve('./packages/eth-web3js/dist/esm/index'), '@ant-design/web3-common': resolve('./packages/common/dist/esm/index'), } : { '@ant-design/web3': resolve('./packages/web3/src/index'), @@ -35,6 +36,7 @@ export default defineConfig({ '@ant-design/web3-wagmi': resolve('./packages/wagmi/src/index'), '@ant-design/web3-ethers': resolve('./packages/ethers/src/index'), '@ant-design/web3-solana': resolve('./packages/solana/src/index'), + '@ant-design/web3-eth-web3js': resolve('./packages/eth-web3js/src/index'), '@ant-design/web3-common': resolve('./packages/common/src/index'), }, }, From cb1c4b75072acb712312bf2748747ce7e1efc83e Mon Sep 17 00:00:00 2001 From: Jeason Date: Mon, 8 Apr 2024 15:06:08 +0800 Subject: [PATCH 2/6] example(web3js): add eth-web3js example --- examples/eth-web3js/.umirc.ts | 11 +++ examples/eth-web3js/package.json | 26 +++++++ examples/eth-web3js/src/pages/index.tsx | 60 +++++++++++++++ examples/eth-web3js/tsconfig.json | 3 + examples/eth-web3js/typings.d.ts | 1 + package.json | 6 ++ packages/eth-web3js/src/hooks/index.ts | 1 - .../src/hooks/use-web3js-signer.test.tsx | 23 ------ .../eth-web3js/src/hooks/use-web3js-signer.ts | 10 --- .../eth-web3js/src/hooks/use-web3js.test.tsx | 6 +- packages/eth-web3js/src/hooks/use-web3js.ts | 8 +- packages/eth-web3js/src/index.ts | 6 +- .../web3js-provider/web3js-provider.test.tsx | 22 +++--- .../src/web3js-provider/web3js-provider.tsx | 10 +-- pnpm-lock.yaml | 73 +++++++++++-------- tsconfig.base.json | 3 +- 16 files changed, 177 insertions(+), 92 deletions(-) create mode 100644 examples/eth-web3js/.umirc.ts create mode 100644 examples/eth-web3js/package.json create mode 100644 examples/eth-web3js/src/pages/index.tsx create mode 100644 examples/eth-web3js/tsconfig.json create mode 100644 examples/eth-web3js/typings.d.ts delete mode 100644 packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx delete mode 100644 packages/eth-web3js/src/hooks/use-web3js-signer.ts diff --git a/examples/eth-web3js/.umirc.ts b/examples/eth-web3js/.umirc.ts new file mode 100644 index 000000000..3ed6f51b1 --- /dev/null +++ b/examples/eth-web3js/.umirc.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'umi'; + +export default defineConfig({ + routes: [{ path: '/', component: 'index' }], + npmClient: 'pnpm', + chainWebpack(config) { + // See: https://github.com/webpack/webpack/issues/11467 + config.module.rule('mjs-rule').resolve.set('fullySpecified', false); + }, + mfsu: false, +}); diff --git a/examples/eth-web3js/package.json b/examples/eth-web3js/package.json new file mode 100644 index 000000000..c4cf9e244 --- /dev/null +++ b/examples/eth-web3js/package.json @@ -0,0 +1,26 @@ +{ + "name": "@example/eth-web3js", + "private": true, + "author": "Jeason ", + "type": "module", + "scripts": { + "dev": "umi dev", + "build": "umi build", + "postinstall": "umi setup", + "setup": "umi setup" + }, + "dependencies": { + "@ant-design/web3": "workspace:*", + "@ant-design/web3-assets": "workspace:*", + "@ant-design/web3-common": "workspace:*", + "@ant-design/web3-eth-web3js": "workspace:*", + "antd": "^5.15.4", + "web3": "^4.7.0", + "umi": "^4.1.5" + }, + "devDependencies": { + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.22", + "typescript": "^5.4.3" + } +} diff --git a/examples/eth-web3js/src/pages/index.tsx b/examples/eth-web3js/src/pages/index.tsx new file mode 100644 index 000000000..1095c371a --- /dev/null +++ b/examples/eth-web3js/src/pages/index.tsx @@ -0,0 +1,60 @@ +import { ConnectButton, Connector } from '@ant-design/web3'; +import { Mainnet } from '@ant-design/web3-assets'; +import { + EthWeb3jsConfigProvider, + MetaMask, + OkxWallet, + TokenPocket, + // useWeb3js, +} from '@ant-design/web3-eth-web3js'; +import { useConfig as useConfig2 } from '@ant-design/web3-eth-web3js/wagmi'; +import { Button, message } from 'antd'; +import { useConfig } from 'wagmi'; + +const App = () => { + const [messageApi, contextHolder] = message.useMessage(); + + const config = useConfig2(); + console.log(11, config); + + // const web3 = useWeb3js(); + // const account = useAccount(); + + return ( +
+ {contextHolder} + + + + +
+ ); +}; + +export default function HomePage() { + return ( + + + + ); +} diff --git a/examples/eth-web3js/tsconfig.json b/examples/eth-web3js/tsconfig.json new file mode 100644 index 000000000..133cfd82a --- /dev/null +++ b/examples/eth-web3js/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./src/.umi/tsconfig.json" +} diff --git a/examples/eth-web3js/typings.d.ts b/examples/eth-web3js/typings.d.ts new file mode 100644 index 000000000..9ae2fc424 --- /dev/null +++ b/examples/eth-web3js/typings.d.ts @@ -0,0 +1 @@ +import 'umi/typings'; diff --git a/package.json b/package.json index 7d5b8c2fe..da3704656 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "build:docs": "dumi build", "example:ethers": "pnpm run --filter \"@example/ethers\" dev", "example:ethers-v5": "pnpm run --filter \"@example/ethers-v5\" dev", + "example:eth-web3js": "pnpm run --filter \"@example/eth-web3js\" dev", "postinstall": "pnpm run husky:prepare", "changeset": "changeset", "release:prepare": "npm run build && npm run lint && npm run test:ci", @@ -112,5 +113,10 @@ "repository": "https://github.com/ant-design/ant-design-web3.git", "dependencies": { "cross-env": "^7.0.3" + }, + "pnpm": { + "overrides": { + "wagmi": "^2.5.7" + } } } diff --git a/packages/eth-web3js/src/hooks/index.ts b/packages/eth-web3js/src/hooks/index.ts index 843fd48f9..feae3d957 100644 --- a/packages/eth-web3js/src/hooks/index.ts +++ b/packages/eth-web3js/src/hooks/index.ts @@ -1,2 +1 @@ export * from './use-web3js'; -export * from './use-web3js-signer'; diff --git a/packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx b/packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx deleted file mode 100644 index 0f4935834..000000000 --- a/packages/eth-web3js/src/hooks/use-web3js-signer.test.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { render } from '@testing-library/react'; -import { describe, expect, test } from 'vitest'; - -import { Web3jsConfigProvider } from '../web3js-provider'; -import { useWeb3jsSigner } from './use-web3js-signer'; - -describe('useEthersSigner', async () => { - test('basic usage', async () => { - const CustomConnector: React.FC = () => { - const signer = useWeb3jsSigner()!; - return
{signer.defaultAccount}
; - }; - - const App = () => ( - - - - ); - - const { baseElement } = render(); - expect(baseElement.textContent).toBe(''); - }); -}); diff --git a/packages/eth-web3js/src/hooks/use-web3js-signer.ts b/packages/eth-web3js/src/hooks/use-web3js-signer.ts deleted file mode 100644 index 8aae2092b..000000000 --- a/packages/eth-web3js/src/hooks/use-web3js-signer.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useMemo } from 'react'; -import { useConnectorClient, type Config } from 'wagmi'; -import type Web3 from 'web3'; - -import { clientToWeb3js } from './use-web3js'; - -export function useWeb3jsSigner(): Web3 | null { - const { data: client } = useConnectorClient(); - return useMemo(() => (client ? clientToWeb3js(client) : null), [client]); -} diff --git a/packages/eth-web3js/src/hooks/use-web3js.test.tsx b/packages/eth-web3js/src/hooks/use-web3js.test.tsx index df7fdd084..946ad7656 100644 --- a/packages/eth-web3js/src/hooks/use-web3js.test.tsx +++ b/packages/eth-web3js/src/hooks/use-web3js.test.tsx @@ -2,7 +2,7 @@ import { render } from '@testing-library/react'; import { describe, expect, test } from 'vitest'; import Web3 from 'web3'; -import { Web3jsConfigProvider } from '../web3js-provider'; +import { EthWeb3jsConfigProvider } from '../web3js-provider'; import { useWeb3js } from './use-web3js'; describe('useWeb3js', async () => { @@ -14,9 +14,9 @@ describe('useWeb3js', async () => { }; const App = () => ( - + - + ); render(); diff --git a/packages/eth-web3js/src/hooks/use-web3js.ts b/packages/eth-web3js/src/hooks/use-web3js.ts index 546a4ad8b..f353628a0 100644 --- a/packages/eth-web3js/src/hooks/use-web3js.ts +++ b/packages/eth-web3js/src/hooks/use-web3js.ts @@ -1,12 +1,10 @@ import { useMemo } from 'react'; import type { Chain, Client, Transport } from 'viem'; -import { useClient, type Config } from 'wagmi'; +import { useConnectorClient, type Config } from 'wagmi'; import { Web3 } from 'web3'; -export const clientToWeb3js = (client?: Client): Web3 => { - if (!client) return new Web3(); +export const clientToWeb3js = (client: Client): Web3 => { const { transport } = client; - if (transport.type === 'fallback') { return new Web3(transport.transports[0].value.url); } @@ -14,6 +12,6 @@ export const clientToWeb3js = (client?: Client): Web3 => { }; export function useWeb3js(): Web3 | null { - const client = useClient(); + const { data: client } = useConnectorClient(); return useMemo(() => (client ? clientToWeb3js(client) : null), [client]); } diff --git a/packages/eth-web3js/src/index.ts b/packages/eth-web3js/src/index.ts index 10df5db4b..bf2706e01 100644 --- a/packages/eth-web3js/src/index.ts +++ b/packages/eth-web3js/src/index.ts @@ -1,3 +1,3 @@ -// export * from './ethers-provider'; -// export * from './wallets'; -// export * from './hooks'; +export * from './web3js-provider'; +export * from './wallets'; +export * from './hooks'; diff --git a/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx b/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx index 649b3ac40..835eea13a 100644 --- a/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx +++ b/packages/eth-web3js/src/web3js-provider/web3js-provider.test.tsx @@ -5,7 +5,7 @@ import { render } from '@testing-library/react'; import { describe, expect, test } from 'vitest'; import { MetaMask, TokenPocket } from '../wallets'; -import { Web3jsConfigProvider } from './web3js-provider'; +import { EthWeb3jsConfigProvider } from './web3js-provider'; describe('web3js-provider', async () => { test('basic usage', async () => { @@ -17,9 +17,9 @@ describe('web3js-provider', async () => { }; const App = () => ( - + - + ); const { baseElement } = render(); @@ -35,9 +35,9 @@ describe('web3js-provider', async () => { }; const App = () => ( - + - + ); const { baseElement } = render(); @@ -55,9 +55,9 @@ describe('web3js-provider', async () => { const UnknownChain = { ...Mainnet, name: 'Unknown', id: -9999 }; const App = () => ( - + - + ); const { baseElement } = render(); @@ -73,9 +73,9 @@ describe('web3js-provider', async () => { }; const App = () => ( - + - + ); const { baseElement } = render(); @@ -91,12 +91,12 @@ describe('web3js-provider', async () => { }; const App = () => ( - - + ); const { baseElement } = render(); diff --git a/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx b/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx index 44b9181fb..0d6300f73 100644 --- a/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx +++ b/packages/eth-web3js/src/web3js-provider/web3js-provider.tsx @@ -25,15 +25,13 @@ export interface WalletConnectOptions useWalletConnectOfficialModal?: boolean; } -export interface Web3jsConfigProviderProps extends Omit { +export interface EthWeb3jsConfigProviderProps extends Omit { walletConnect?: false | WalletConnectOptions; } -export const Web3jsConfigProvider: React.FC> = ({ - children, - walletConnect, - ...props -}) => { +export const EthWeb3jsConfigProvider: React.FC< + React.PropsWithChildren +> = ({ children, walletConnect, ...props }) => { const chains = React.useMemo( () => (props.chains ?? [Mainnet]) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ebbdfc28..1fd5a6d8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + wagmi: ^2.5.7 + importers: .: @@ -163,6 +166,40 @@ importers: specifier: ^2.5.7 version: 2.5.7(@tanstack/react-query@5.28.4)(@types/react@18.2.73)(react-dom@18.2.0)(react-native@0.73.6)(react@18.2.0)(typescript@5.4.2)(viem@2.0.0) + examples/eth-web3js: + dependencies: + '@ant-design/web3': + specifier: workspace:* + version: link:../../packages/web3 + '@ant-design/web3-assets': + specifier: workspace:* + version: link:../../packages/assets + '@ant-design/web3-common': + specifier: workspace:* + version: link:../../packages/common + '@ant-design/web3-eth-web3js': + specifier: workspace:* + version: link:../../packages/eth-web3js + antd: + specifier: ^5.15.4 + version: 5.16.0(react-dom@18.2.0)(react@18.2.0) + umi: + specifier: ^4.1.5 + version: 4.1.5(@babel/core@7.24.3)(@types/node@20.10.5)(@types/react@18.2.73)(eslint@8.57.0)(prettier@3.2.5)(react-dom@18.2.0)(react@18.2.0)(stylelint@14.16.1)(typescript@5.4.3)(webpack@5.91.0) + web3: + specifier: ^4.7.0 + version: 4.7.0(typescript@5.4.3) + devDependencies: + '@types/react': + specifier: ^18.2.73 + version: 18.2.73 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.2.23 + typescript: + specifier: ^5.4.3 + version: 5.4.3 + examples/ethers: dependencies: '@ant-design/web3': @@ -1482,7 +1519,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.6): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -2362,7 +2399,7 @@ packages: dependencies: '@babel/core': 7.24.3 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: true @@ -2374,7 +2411,7 @@ packages: dependencies: '@babel/core': 7.23.6 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 dev: true @@ -2386,7 +2423,7 @@ packages: dependencies: '@babel/core': 7.24.3 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.6): @@ -2738,7 +2775,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.24.3): resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} @@ -2747,7 +2784,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.24.3 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.6): resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} @@ -10600,7 +10637,6 @@ packages: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: '@types/node': 20.10.5 - dev: true /@types/yargs-parser@21.0.3: resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -12951,7 +12987,6 @@ packages: optional: true dependencies: typescript: 5.4.3 - dev: true /abitype@0.9.8(typescript@5.4.2): resolution: {integrity: sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==} @@ -13804,7 +13839,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.24.0 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -19468,7 +19503,6 @@ packages: ws: '*' dependencies: ws: 8.16.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - dev: true /isows@1.0.3(ws@8.13.0): resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} @@ -28125,14 +28159,12 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true /web3-errors@1.1.4: resolution: {integrity: sha512-WahtszSqILez+83AxGecVroyZsMuuRT+KmQp4Si5P4Rnqbczno1k748PCrZTS1J4UCPmXMG2/Vt+0Bz2zwXkwQ==} engines: {node: '>=14', npm: '>=6.12.0'} dependencies: web3-types: 1.5.0 - dev: true /web3-eth-abi@4.2.0(typescript@5.4.3): resolution: {integrity: sha512-x7dUCmk6th+5N63s5kUusoNtsDJKUUQgl9+jECvGTBOTiyHe/V6aOY0120FUjaAGaapOnR7BImQdhqHv6yT2YQ==} @@ -28146,7 +28178,6 @@ packages: transitivePeerDependencies: - typescript - zod - dev: true /web3-eth-accounts@4.1.1: resolution: {integrity: sha512-9JqhRi1YhO1hQOEmmBHgEGsME/B1FHMxpA/AK3vhpvQ8QeP6KbJW+cForTLfPpUbkmPxnRunG4PNNaETNlZfrA==} @@ -28159,7 +28190,6 @@ packages: web3-types: 1.5.0 web3-utils: 4.2.2 web3-validator: 2.0.5 - dev: true /web3-eth-contract@4.3.0(typescript@5.4.3): resolution: {integrity: sha512-4fzSklA65zUn6SthU3T3tbVJacfP8/wkJmCuvmPaf2ZTFdnhsF96G5IQtCRf0+wASb4yk0A6IBvXZfk1B4R4HA==} @@ -28178,7 +28208,6 @@ packages: - typescript - utf-8-validate - zod - dev: true /web3-eth-ens@4.2.0(typescript@5.4.3): resolution: {integrity: sha512-qYj34te2UctoObt8rlEIY/t2MuTMiMiiHhO2JAHRGqSLCQ7b8DM3RpvkiiSB0N0ZyEn+CetZqJCTYb8DNKBS/g==} @@ -28199,7 +28228,6 @@ packages: - typescript - utf-8-validate - zod - dev: true /web3-eth-iban@4.0.7: resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} @@ -28209,7 +28237,6 @@ packages: web3-types: 1.5.0 web3-utils: 4.2.2 web3-validator: 2.0.5 - dev: true /web3-eth-personal@4.0.8(typescript@5.4.3): resolution: {integrity: sha512-sXeyLKJ7ddQdMxz1BZkAwImjqh7OmKxhXoBNF3isDmD4QDpMIwv/t237S3q4Z0sZQamPa/pHebJRWVuvP8jZdw==} @@ -28227,7 +28254,6 @@ packages: - typescript - utf-8-validate - zod - dev: true /web3-eth@4.5.0(typescript@5.4.3): resolution: {integrity: sha512-crisE46o/SHMVm+XHAXEaR8k76NCImq+hi0QQEJ+VaLZbDobI/Gvog1HwTukDUDRgnYSAFGqD0cTRyAwDurwpA==} @@ -28250,7 +28276,6 @@ packages: - typescript - utf-8-validate - zod - dev: true /web3-net@4.0.7: resolution: {integrity: sha512-SzEaXFrBjY25iQGk5myaOfO9ZyfTwQEa4l4Ps4HDNVMibgZji3WPzpjq8zomVHMwi8bRp6VV7YS71eEsX7zLow==} @@ -28264,7 +28289,6 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true /web3-providers-http@4.1.0: resolution: {integrity: sha512-6qRUGAhJfVQM41E5t+re5IHYmb5hSaLc02BE2MaRQsz2xKA6RjmHpOA5h/+ojJxEpI9NI2CrfDKOAgtJfoUJQg==} @@ -28276,7 +28300,6 @@ packages: web3-utils: 4.2.2 transitivePeerDependencies: - encoding - dev: true /web3-providers-ipc@4.0.7: resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} @@ -28286,7 +28309,6 @@ packages: web3-errors: 1.1.4 web3-types: 1.5.0 web3-utils: 4.2.2 - dev: true optional: true /web3-providers-ws@4.0.7: @@ -28302,7 +28324,6 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true /web3-rpc-methods@1.2.0: resolution: {integrity: sha512-CWJ/g4I4WyYvLkf21wCZAehdhU/VjX/OAPHnqF5/FPDJlogOsOnGXHqi1Z5AP+ocdt395PNubd8jyMMJoYGSBA==} @@ -28315,12 +28336,10 @@ packages: - bufferutil - encoding - utf-8-validate - dev: true /web3-types@1.5.0: resolution: {integrity: sha512-geWuMIeegQ8AedKAO6wO4G4j1gyQ1F/AyKLMw2vud4bsfZayyzWJgCMDZtjYMm5uo2a7i8j1W3/4QFmzlSy5cw==} engines: {node: '>=14', npm: '>=6.12.0'} - dev: true /web3-utils@1.10.3: resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} @@ -28345,7 +28364,6 @@ packages: web3-errors: 1.1.4 web3-types: 1.5.0 web3-validator: 2.0.5 - dev: true /web3-validator@2.0.5: resolution: {integrity: sha512-2gLOSW8XqEN5pw5jVUm20EB7A8SbQiekpAtiI0JBmCIV0a2rp97v8FgWY5E3UEqnw5WFfEqvcDVW92EyynDTyQ==} @@ -28356,7 +28374,6 @@ packages: web3-errors: 1.1.4 web3-types: 1.5.0 zod: 3.22.4 - dev: true /web3@4.7.0(typescript@5.4.3): resolution: {integrity: sha512-3g+1e7B/IW0Nw9WP1dotrZKWD9o5IBfl27dxEnE1LxBZBax6ZkviiAwf18utIhlNBD07RgI+PPfKDXxfDBlHWA==} @@ -28384,7 +28401,6 @@ packages: - typescript - utf-8-validate - zod - dev: true /webextension-polyfill-ts@0.25.0: resolution: {integrity: sha512-ikQhwwHYkpBu00pFaUzIKY26I6L87DeRI+Q6jBT1daZUNuu8dSrg5U9l/ZbqdaQ1M/TTSPKeAa3kolP5liuedw==} @@ -28935,7 +28951,6 @@ packages: /zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: true /zustand@4.4.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==} diff --git a/tsconfig.base.json b/tsconfig.base.json index 4f8114108..2a9ed2eb0 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -24,7 +24,8 @@ "@ant-design/web3-ethers/legacy-v5": ["./packages/ethers/src/index-v5.ts"], "@ant-design/web3-ethers/wagmi": ["./packages/ethers/src/wagmi.ts"], "@ant-design/web3-solana": ["./packages/solana/src/"], - "@ant-design/web3-eth-web3js": ["./packages/eth-web3js/src/"] + "@ant-design/web3-eth-web3js": ["./packages/eth-web3js/src/"], + "@ant-design/web3-eth-web3js/wagmi": ["./packages/eth-web3js/src/wagmi.ts"] } } } From 4ad142bd32b0efc83213d49b224b026f4a4a43d6 Mon Sep 17 00:00:00 2001 From: Jeason Date: Tue, 14 May 2024 15:14:20 +0800 Subject: [PATCH 3/6] chore(web3js): finish web3js example --- examples/eth-web3js/src/pages/index.tsx | 29 ++++++++++--------------- packages/eth-web3js/package.json | 2 +- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/examples/eth-web3js/src/pages/index.tsx b/examples/eth-web3js/src/pages/index.tsx index 1095c371a..5d04dc634 100644 --- a/examples/eth-web3js/src/pages/index.tsx +++ b/examples/eth-web3js/src/pages/index.tsx @@ -5,20 +5,14 @@ import { MetaMask, OkxWallet, TokenPocket, - // useWeb3js, + useWeb3js, } from '@ant-design/web3-eth-web3js'; -import { useConfig as useConfig2 } from '@ant-design/web3-eth-web3js/wagmi'; import { Button, message } from 'antd'; -import { useConfig } from 'wagmi'; const App = () => { const [messageApi, contextHolder] = message.useMessage(); - const config = useConfig2(); - console.log(11, config); - - // const web3 = useWeb3js(); - // const account = useAccount(); + const web3 = useWeb3js(); return (
@@ -28,16 +22,15 @@ const App = () => { +
Signature: {signature}
+ + ); +}; + +const App: React.FC = () => { + return ( + + + + + + + + + ); +}; + +export default App; diff --git a/packages/web3/src/ethereum-web3js/index.md b/packages/web3/src/ethereum-web3js/index.md new file mode 100644 index 000000000..264cb7c9a --- /dev/null +++ b/packages/web3/src/ethereum-web3js/index.md @@ -0,0 +1,37 @@ +--- +nav: Components +order: 4 +group: + title: Connect Blockchains + order: 2 +--- + +# Ethereum (web3js) + +Developers who are familiar with `web3js` can install `@ant-design/web3-eth-web3js` and use it with the component library. Most of the usage is consistent with the `wagmi` adapter. + + + +### Basic usage + +This example shows basic usage using the `web3js` adapter. We provide `useWeb3js` react hooks to obtain `web3` instances, and you can use them in components to perform on-chain operations. + + + +### Sign message + +This example shows how to use the `web3js` adapter to sign messages. For more example methods, please refer to [web3js documentation](https://docs.web3js.org/). + + + +### EthWeb3jsConfigProvider + +| Property | Description | Type | Default | Version | +| --- | --- | --- | --- | --- | +| wallets | Wallets | [WalletFactory](#walletfactory)[] | - | - | +| chains | Chains | [Chain](./types#chain)[] | - | - | +| ens | Whether to display ENS | `boolean` | - | - | +| balance | Whether to display balance | `boolean` | - | - | +| locale | Multilingual settings | [Locale](https://github.com/ant-design/ant-design-web3/blob/main/packages/common/src/locale/en_US.ts) | - | - | +| eip6963 | Whether to use EIP6963 protocol wallet and related configurations | `boolean` \| `EIP6963Config` | `false` | | +| walletConnect | Whether to use the Wallet Connect protocol | `false` \| [WalletConnectOptions](https://wagmi.sh/core/api/connectors/walletConnect#parameters) | `false` | | diff --git a/packages/web3/src/ethereum-web3js/index.zh-CN.md b/packages/web3/src/ethereum-web3js/index.zh-CN.md new file mode 100644 index 000000000..40b6c0264 --- /dev/null +++ b/packages/web3/src/ethereum-web3js/index.zh-CN.md @@ -0,0 +1,38 @@ +--- +nav: 组件 +subtitle: 以太坊 +order: 4 +group: + title: 连接链 + order: 2 +--- + +# Ethereum (web3js) + +熟悉 `web3js` 的开发者可以安装 `@ant-design/web3-eth-web3js` 配合组件库使用,其中绝大部份用法都与 `wagmi` 适配器一致。 + + + +### 基本使用 + +这个例子展示了使用 `web3js` 适配器的基本用法。我们提供了 `useWeb3js` react hooks 来获取 `web3` 实例,你可以在组件中使用它们来进行链上操作。 + + + +### 签名消息 + +这个例子展示了如何使用 `web3js` 适配器签名消息,更多实例方法请参考 [web3js 文档](https://docs.web3js.org/)。 + + + +### EthWeb3jsConfigProvider + +| 属性 | 描述 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| wallets | 钱包配置 | [WalletFactory](#walletfactory)\[\] | - | - | +| chains | 链的配置 | [Chain](./types#chain)\[\] | - | - | +| ens | 是否显示 ENS | `boolean` | - | - | +| balance | 是否显示余额 | `boolean` | - | - | +| locale | 多语言设置 | [Locale](https://github.com/ant-design/ant-design-web3/blob/main/packages/common/src/locale/zh_CN.ts) | - | - | +| eip6963 | 是否采用 EIP6963 协议钱包以及相关配置 | `boolean` \| `EIP6963Config` | `false` | | +| walletConnect | 是否采用 Wallet Connect 协议 | `false` \| [WalletConnectOptions](https://wagmi.sh/core/api/connectors/walletConnect#parameters) | `false` | | diff --git a/packages/web3/src/solana/index.md b/packages/web3/src/solana/index.md index 305c5eca9..d14598f6a 100644 --- a/packages/web3/src/solana/index.md +++ b/packages/web3/src/solana/index.md @@ -1,6 +1,6 @@ --- nav: Components -order: 4 +order: 5 group: title: Connect Blockchains order: 2 diff --git a/packages/web3/src/solana/index.zh-CN.md b/packages/web3/src/solana/index.zh-CN.md index 8578f4351..9b71abcb7 100644 --- a/packages/web3/src/solana/index.zh-CN.md +++ b/packages/web3/src/solana/index.zh-CN.md @@ -1,7 +1,7 @@ --- nav: 组件 subtitle: 索拉纳 -order: 4 +order: 5 group: title: 连接链 order: 2 From 1a144e12ca3d79855db18a6634733dfc0e45ded2 Mon Sep 17 00:00:00 2001 From: Jeason Date: Tue, 14 May 2024 16:05:47 +0800 Subject: [PATCH 5/6] chore(web3js): add changesets --- .changeset/dirty-birds-knock.md | 5 +++++ .changeset/silver-seahorses-kick.md | 5 +++++ packages/eth-web3js/package.json | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .changeset/dirty-birds-knock.md create mode 100644 .changeset/silver-seahorses-kick.md diff --git a/.changeset/dirty-birds-knock.md b/.changeset/dirty-birds-knock.md new file mode 100644 index 000000000..61b211c61 --- /dev/null +++ b/.changeset/dirty-birds-knock.md @@ -0,0 +1,5 @@ +--- +"@ant-design/web3": patch +--- + +chore(web3js): add doc and demo for web3js diff --git a/.changeset/silver-seahorses-kick.md b/.changeset/silver-seahorses-kick.md new file mode 100644 index 000000000..d9321216f --- /dev/null +++ b/.changeset/silver-seahorses-kick.md @@ -0,0 +1,5 @@ +--- +"@ant-design/web3-eth-web3js": major +--- + +feat(web3js): support web3js adapter for ethereum diff --git a/packages/eth-web3js/package.json b/packages/eth-web3js/package.json index c59b880c5..dd9c80ed2 100644 --- a/packages/eth-web3js/package.json +++ b/packages/eth-web3js/package.json @@ -1,6 +1,6 @@ { "name": "@ant-design/web3-eth-web3js", - "version": "0.0.1", + "version": "0.1.0", "type": "module", "main": "dist/esm/index.js", "module": "dist/esm/index.js", From 8931f7dc47154a6003ae2df2fb79d24b6873bc27 Mon Sep 17 00:00:00 2001 From: Jeason Date: Tue, 14 May 2024 16:35:02 +0800 Subject: [PATCH 6/6] test(web3js): fix coverage --- .../eth-web3js/src/hooks/use-web3js.test.tsx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/eth-web3js/src/hooks/use-web3js.test.tsx b/packages/eth-web3js/src/hooks/use-web3js.test.tsx index 946ad7656..89f8a3eec 100644 --- a/packages/eth-web3js/src/hooks/use-web3js.test.tsx +++ b/packages/eth-web3js/src/hooks/use-web3js.test.tsx @@ -1,24 +1,27 @@ +import { Mainnet } from '@ant-design/web3-assets'; import { render } from '@testing-library/react'; -import { describe, expect, test } from 'vitest'; -import Web3 from 'web3'; +import { describe, expect, test, vi } from 'vitest'; +import { MetaMask } from '../wallets'; import { EthWeb3jsConfigProvider } from '../web3js-provider'; import { useWeb3js } from './use-web3js'; describe('useWeb3js', async () => { test('basic usage', async () => { const CustomConnector: React.FC = () => { - const web3 = useWeb3js(); - expect(web3).instanceOf(Web3); - return null; + useWeb3js(); + return
web3js
; }; const App = () => ( - + ); - render(); + const { baseElement } = render(); + await vi.waitFor(() => { + expect(baseElement.querySelector('.text')?.textContent).toBe('web3js'); + }); }); });