From 7a795af506bba81063c3b5b82bd352ad7a19ca10 Mon Sep 17 00:00:00 2001 From: jeffhu1 Date: Wed, 21 Sep 2022 17:55:28 -0700 Subject: [PATCH 1/2] feat: add support for walletconnect wallet --- packages/use-solana/package.json | 1 + packages/use-solana/src/adapters/types.ts | 6 +- packages/use-solana/src/context.tsx | 8 +- packages/use-solana/src/providers.ts | 27 +- .../use-solana/src/utils/useWalletInternal.ts | 16 +- packages/wallet-adapter-icons/src/index.tsx | 17 + yarn.lock | 1008 ++++++++++++++++- 7 files changed, 1068 insertions(+), 15 deletions(-) diff --git a/packages/use-solana/package.json b/packages/use-solana/package.json index 840a3f4b3..3eec940c5 100644 --- a/packages/use-solana/package.json +++ b/packages/use-solana/package.json @@ -48,6 +48,7 @@ "@solana/wallet-adapter-solflare": "^0.6.15", "@solana/wallet-adapter-sollet": "^0.11.10", "@solana/wallet-adapter-solong": "^0.9.11", + "@solana/wallet-adapter-walletconnect": "^0.1.5", "eventemitter3": "^4.0.7", "fast-json-stable-stringify": "^2.1.0", "tiny-invariant": "^1.2.0", diff --git a/packages/use-solana/src/adapters/types.ts b/packages/use-solana/src/adapters/types.ts index 5714c03c6..4b68fd6cc 100644 --- a/packages/use-solana/src/adapters/types.ts +++ b/packages/use-solana/src/adapters/types.ts @@ -5,6 +5,7 @@ import type { Wallet, } from "@saberhq/solana-contrib"; import { PublicKey } from "@saberhq/solana-contrib"; +import type { WalletConnectWalletAdapterConfig } from "@solana/wallet-adapter-walletconnect"; import type { Connection, PublicKey as SolanaPublicKey, @@ -38,9 +39,12 @@ export interface WalletAdapter export type ConnectedWallet = WalletAdapter & Wallet; +export type WalletOptions = WalletConnectWalletAdapterConfig; + export type WalletAdapterBuilder = ( providerUrl: string, - endpoint: string + endpoint: string, + options?: WalletOptions ) => WalletAdapter; /** diff --git a/packages/use-solana/src/context.tsx b/packages/use-solana/src/context.tsx index 0c0c0835f..9c6354082 100644 --- a/packages/use-solana/src/context.tsx +++ b/packages/use-solana/src/context.tsx @@ -36,7 +36,11 @@ export interface UseSolanaArgs< Partial< Pick< UseWalletArgs, - "onConnect" | "onDisconnect" | "storageAdapter" | "walletProviders" + | "onConnect" + | "onDisconnect" + | "storageAdapter" + | "walletProviders" + | "walletOptions" > >, Pick { @@ -80,6 +84,7 @@ const useSolanaInternal = >({ onError = defaultOnError, storageAdapter = LOCAL_STORAGE_ADAPTER, walletProviders = DEFAULT_WALLET_PROVIDERS as unknown as WalletProviderMap, + walletOptions, // useProvider args broadcastConnections, @@ -100,6 +105,7 @@ const useSolanaInternal = >({ onError, storageAdapter, walletProviders, + walletOptions, }); const providerCtx = useProviderInternal({ connection: connectionCtx.connection, diff --git a/packages/use-solana/src/providers.ts b/packages/use-solana/src/providers.ts index f262ced3f..8ba8ec47b 100644 --- a/packages/use-solana/src/providers.ts +++ b/packages/use-solana/src/providers.ts @@ -16,6 +16,7 @@ import { SLOPE, SOLFLARE, SOLLET, + WALLETCONNECT, } from "@saberhq/wallet-adapter-icons"; import type { WalletAdapterNetwork } from "@solana/wallet-adapter-base"; import { BraveWalletAdapter } from "@solana/wallet-adapter-brave"; @@ -34,9 +35,10 @@ import { SolletWalletAdapter, } from "@solana/wallet-adapter-sollet"; import { SolongWalletAdapter } from "@solana/wallet-adapter-solong"; +import { WalletConnectWalletAdapter } from "@solana/wallet-adapter-walletconnect"; import type * as React from "react"; -import type { WalletAdapterBuilder } from "./adapters"; +import type { WalletAdapterBuilder, WalletOptions } from "./adapters"; import { LedgerWalletAdapter, SolanaWalletAdapter } from "./adapters"; import { ReadonlyAdapter } from "./adapters/readonly"; import { SecretKeyAdapter } from "./adapters/secret-key"; @@ -60,6 +62,7 @@ export enum DefaultWalletType { Sollet = "Sollet", SolletExtension = "SolletExtension", Solong = "Solong", + WalletConnect = "WalletConnect", } export type WalletTypeEnum = { [name: string]: T[keyof T] | string }; @@ -98,6 +101,28 @@ export const DEFAULT_WALLET_PROVIDERS: WalletProviderMap< isInstalled: () => window.sollet !== undefined, }, + [DefaultWalletType.WalletConnect]: { + name: "WalletConnect", + url: "https://walletconnect.com/", + icon: WALLETCONNECT, + makeAdapter: ( + _provider: string, + network: string, + options?: WalletOptions + ) => { + if (!options) { + throw new Error("WalletConnect options not provided"); + } + return new SolanaWalletAdapter( + new WalletConnectWalletAdapter({ + network: network as + | WalletAdapterNetwork.Mainnet + | WalletAdapterNetwork.Devnet, + options: options["options"] as unknown, + }) + ); + }, + }, [DefaultWalletType.BraveWallet]: { name: "Brave Wallet", url: "https://www.brave.com/wallet", diff --git a/packages/use-solana/src/utils/useWalletInternal.ts b/packages/use-solana/src/utils/useWalletInternal.ts index e448fe3d7..9f0f66949 100644 --- a/packages/use-solana/src/utils/useWalletInternal.ts +++ b/packages/use-solana/src/utils/useWalletInternal.ts @@ -3,7 +3,11 @@ import type { PublicKey } from "@solana/web3.js"; import stringify from "fast-json-stable-stringify"; import { useCallback, useEffect, useMemo, useState } from "react"; -import type { ConnectedWallet, WalletAdapter } from "../adapters/types"; +import type { + ConnectedWallet, + WalletAdapter, + WalletOptions, +} from "../adapters/types"; import { WrappedWalletAdapter } from "../adapters/types"; import type { UseSolanaError } from "../error"; import { @@ -73,6 +77,7 @@ export interface UseWalletArgs> { endpoint: string; storageAdapter: StorageAdapter; walletProviders: WalletProviderMap; + walletOptions?: WalletOptions; } interface WalletConfig> { @@ -90,6 +95,7 @@ export const useWalletInternal = < onError, storageAdapter, walletProviders, + walletOptions, }: UseWalletArgs): UseWallet => { const [walletConfigStr, setWalletConfigStr] = usePersistedKVStore< string | null @@ -119,11 +125,15 @@ export const useWalletInternal = < if (walletType) { const provider = walletProviders[walletType]; console.debug("New wallet", provider.url, network); - const adapter = provider.makeAdapter(provider.url, endpoint); + const adapter = provider.makeAdapter( + provider.url, + endpoint, + walletOptions + ); return [provider, new WrappedWalletAdapter(adapter)]; } return [undefined, undefined]; - }, [walletProviders, walletType, network, endpoint]); + }, [walletProviders, walletType, network, endpoint, walletOptions]); useEffect(() => { let disabled = false; diff --git a/packages/wallet-adapter-icons/src/index.tsx b/packages/wallet-adapter-icons/src/index.tsx index 8bb6a2bc5..6681f2827 100644 --- a/packages/wallet-adapter-icons/src/index.tsx +++ b/packages/wallet-adapter-icons/src/index.tsx @@ -399,6 +399,23 @@ export const HUOBI: React.FC> = (props) => ( ); +export const WALLETCONNECT: React.FC> = ( + props +) => ( + + + +); + export const NIGHTLY: React.FC> = (props) => ( = 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -9737,6 +10619,16 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^1.0.2": + version: 1.4.1 + resolution: "sonic-boom@npm:1.4.1" + dependencies: + atomic-sleep: ^1.0.0 + flatstr: ^1.0.12 + checksum: 189fa8fe5c2dc05d3513fc1a4926a2f16f132fa6fa0b511745a436010cdcd9c1d3b3cb6a9d7c05bd32a965dc77673a5ac0eb0992e920bdedd16330d95323124f + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -9771,6 +10663,15 @@ __metadata: languageName: node linkType: hard +"split2@npm:^3.1.1": + version: 3.2.2 + resolution: "split2@npm:3.2.2" + dependencies: + readable-stream: ^3.0.0 + checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -9867,6 +10768,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^3.0.0, string-width@npm:^3.1.0": + version: 3.1.0 + resolution: "string-width@npm:3.1.0" + dependencies: + emoji-regex: ^7.0.1 + is-fullwidth-code-point: ^2.0.0 + strip-ansi: ^5.1.0 + checksum: 57f7ca73d201682816d573dc68bd4bb8e1dff8dc9fcf10470fdfc3474135c97175fec12ea6a159e67339b41e86963112355b64529489af6e7e70f94a7caf08b2 + languageName: node + linkType: hard + "string-width@npm:^5.0.0": version: 5.1.2 resolution: "string-width@npm:5.1.2" @@ -9925,6 +10837,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^5.0.0, strip-ansi@npm:^5.1.0, strip-ansi@npm:^5.2.0": + version: 5.2.0 + resolution: "strip-ansi@npm:5.2.0" + dependencies: + ansi-regex: ^4.1.0 + checksum: bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46 + languageName: node + linkType: hard + "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -10187,6 +11108,13 @@ __metadata: languageName: node linkType: hard +"toggle-selection@npm:^1.0.6": + version: 1.0.6 + resolution: "toggle-selection@npm:1.0.6" + checksum: a90dc80ed1e7b18db8f4e16e86a5574f87632dc729cfc07d9ea3ced50021ad42bb4e08f22c0913e0b98e3837b0b717e0a51613c65f30418e21eb99da6556a74c + languageName: node + linkType: hard + "toml@npm:^3.0.0": version: 3.0.0 resolution: "toml@npm:3.0.0" @@ -10423,6 +11351,15 @@ __metadata: languageName: node linkType: hard +"uint8arrays@npm:3.1.0, uint8arrays@npm:^3.0.0": + version: 3.1.0 + resolution: "uint8arrays@npm:3.1.0" + dependencies: + multiformats: ^9.4.2 + checksum: 77fe0c8644417a849f5cfc0e5a5308c65e3b779a56f816dd27b8f60f7fac1ac7626f57c9abacec77d147beb5da8401b86438b1591d93cae7f7511a3211cc01b3 + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -10665,6 +11602,13 @@ __metadata: languageName: node linkType: hard +"which-module@npm:^2.0.0": + version: 2.0.0 + resolution: "which-module@npm:2.0.0" + checksum: 809f7fd3dfcb2cdbe0180b60d68100c88785084f8f9492b0998c051d7a8efe56784492609d3f09ac161635b78ea29219eb1418a98c15ce87d085bce905705c9c + languageName: node + linkType: hard + "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -10692,6 +11636,17 @@ __metadata: languageName: node linkType: hard +"wrap-ansi@npm:^5.1.0": + version: 5.1.0 + resolution: "wrap-ansi@npm:5.1.0" + dependencies: + ansi-styles: ^3.2.0 + string-width: ^3.0.0 + strip-ansi: ^5.0.0 + checksum: 9b48c862220e541eb0daa22661b38b947973fc57054e91be5b0f2dcc77741a6875ccab4ebe970a394b4682c8dfc17e888266a105fb8b0a9b23c19245e781ceae + languageName: node + linkType: hard + "wrap-ansi@npm:^6.2.0": version: 6.2.0 resolution: "wrap-ansi@npm:6.2.0" @@ -10731,7 +11686,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.4.5": +"ws@npm:^7.4.5, ws@npm:^7.5.1": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -10761,6 +11716,13 @@ __metadata: languageName: node linkType: hard +"y18n@npm:^4.0.0": + version: 4.0.3 + resolution: "y18n@npm:4.0.3" + checksum: 014dfcd9b5f4105c3bb397c1c8c6429a9df004aa560964fb36732bfb999bfe83d45ae40aeda5b55d21b1ee53d8291580a32a756a443e064317953f08025b1aa4 + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" @@ -10782,6 +11744,16 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^13.1.2": + version: 13.1.2 + resolution: "yargs-parser@npm:13.1.2" + dependencies: + camelcase: ^5.0.0 + decamelize: ^1.2.0 + checksum: c8bb6f44d39a4acd94462e96d4e85469df865de6f4326e0ab1ac23ae4a835e5dd2ddfe588317ebf80c3a7e37e741bd5cb0dc8d92bcc5812baefb7df7c885e86b + languageName: node + linkType: hard + "yargs-parser@npm:^21.0.0, yargs-parser@npm:^21.0.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -10789,6 +11761,24 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^13.2.4": + version: 13.3.2 + resolution: "yargs@npm:13.3.2" + dependencies: + cliui: ^5.0.0 + find-up: ^3.0.0 + get-caller-file: ^2.0.1 + require-directory: ^2.1.1 + require-main-filename: ^2.0.0 + set-blocking: ^2.0.0 + string-width: ^3.0.0 + which-module: ^2.0.0 + y18n: ^4.0.0 + yargs-parser: ^13.1.2 + checksum: 75c13e837eb2bb25717957ba58d277e864efc0cca7f945c98bdf6477e6ec2f9be6afa9ed8a876b251a21423500c148d7b91e88dee7adea6029bdec97af1ef3e8 + languageName: node + linkType: hard + "yargs@npm:^17.3.1": version: 17.5.1 resolution: "yargs@npm:17.5.1" From d9a6cef3e8755a264445cc7c6925466044646e70 Mon Sep 17 00:00:00 2001 From: jeffhu1 Date: Thu, 22 Sep 2022 16:11:20 -0700 Subject: [PATCH 2/2] fix: update size limit config to ignore walletconnect adapter --- .size-limit.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.size-limit.json b/.size-limit.json index 8499580c3..c13f14980 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -42,7 +42,8 @@ "@solana/wallet-adapter-slope", "@solana/wallet-adapter-solflare", "@solana/wallet-adapter-sollet", - "@solana/wallet-adapter-solong" + "@solana/wallet-adapter-solong", + "@solana/wallet-adapter-walletconnect" ], "webpack": true }