diff --git a/packages/core/src/manager.ts b/packages/core/src/manager.ts index 8c8a4a976..35d6767cf 100644 --- a/packages/core/src/manager.ts +++ b/packages/core/src/manager.ts @@ -41,14 +41,14 @@ export interface WalletManagerOptions { } export interface WalletManagerConfig { - wallets?: WalletAdapterConfig[] + wallets?: WalletAdapterConfig[] networks?: Record defaultNetwork?: string options?: WalletManagerOptions } export class WalletManager { - public _clients: Map = new Map() + public _clients: Map> = new Map() private _capabilities: Map = new Map() private baseNetworkConfig: Record public store: Store @@ -249,9 +249,9 @@ export class WalletManager { // ---------- Scoped Store Access ----------------------------------- // - private createStoreAccessor(walletKey: string): AdapterStoreAccessor { + private createStoreAccessor(walletKey: string): AdapterStoreAccessor { return { - getWalletState: () => this.store.state.wallets[walletKey], + getWalletState: () => this.store.state.wallets[walletKey] as WalletState | undefined, getActiveWallet: () => this.store.state.activeWallet, getActiveNetwork: () => this.store.state.activeNetwork, getState: () => this.store.state, @@ -275,7 +275,7 @@ export class WalletManager { // ---------- Wallets ----------------------------------------------- // - private initializeWallets(walletConfigs: WalletAdapterConfig[]) { + private initializeWallets(walletConfigs: WalletAdapterConfig[]) { this.logger.info('Initializing wallets...') for (const config of walletConfigs) { @@ -288,7 +288,7 @@ export class WalletManager { const storeAccessor = this.createStoreAccessor(walletKey) - const params: AdapterConstructorParams = { + const params: AdapterConstructorParams = { id: config.id, metadata: config.metadata, store: storeAccessor, @@ -329,7 +329,7 @@ export class WalletManager { } } - public get wallets(): BaseWallet[] { + public get wallets(): BaseWallet[] { return [...this._clients.values()] } @@ -377,12 +377,12 @@ export class WalletManager { } } - public get availableWallets(): BaseWallet[] { + public get availableWallets(): BaseWallet[] { const activeNetwork = this.store.state.activeNetwork return this.wallets.filter((w) => this.isWalletAvailable(w.walletKey, activeNetwork)) } - public getWallet(walletKey: WalletKey): BaseWallet | undefined { + public getWallet(walletKey: WalletKey): BaseWallet | undefined { return this._clients.get(walletKey) } @@ -558,7 +558,7 @@ export class WalletManager { // ---------- Active Wallet ----------------------------------------- // - public get activeWallet(): BaseWallet | null { + public get activeWallet(): BaseWallet | null { const state = this.store.state const activeWallet = this.wallets.find((wallet) => wallet.walletKey === state.activeWallet) if (!activeWallet) { @@ -598,7 +598,7 @@ export class WalletManager { // ---------- Sign Transactions ------------------------------------- // - public get signTransactions(): BaseWallet['signTransactions'] { + public get signTransactions(): BaseWallet['signTransactions'] { if (!this.activeWallet) { this.logger.error('No active wallet found!') throw new Error('No active wallet found!') diff --git a/packages/core/src/wallets/base.ts b/packages/core/src/wallets/base.ts index 32cf02d58..4e60e5e33 100644 --- a/packages/core/src/wallets/base.ts +++ b/packages/core/src/wallets/base.ts @@ -11,13 +11,16 @@ import type { WalletMetadata } from 'src/wallets/types' -export abstract class BaseWallet> { +export abstract class BaseWallet< + TType extends WalletAccount = WalletAccount, + TOptions = Record +> { public readonly id: string public readonly walletKey: string public metadata: WalletMetadata protected options: TOptions - protected store: AdapterStoreAccessor + protected store: AdapterStoreAccessor protected getAlgodClient: () => algosdk.Algodv2 public subscribe: (callback: (state: State) => void) => () => void @@ -31,7 +34,7 @@ export abstract class BaseWallet> { subscribe, getAlgodClient, options - }: AdapterConstructorParams) { + }: AdapterConstructorParams) { this.id = id this.walletKey = id this.metadata = { ...metadata } @@ -48,7 +51,7 @@ export abstract class BaseWallet> { // ---------- Public Methods ---------------------------------------- // - public abstract connect(args?: Record): Promise + public abstract connect(args?: Record): Promise public abstract disconnect(): Promise public abstract resumeSession(): Promise @@ -105,7 +108,7 @@ export abstract class BaseWallet> { return this.id.toUpperCase() } - public get accounts(): WalletAccount[] { + public get accounts(): TType[] { const walletState = this.store.getWalletState() return walletState ? walletState.accounts : [] } @@ -114,7 +117,7 @@ export abstract class BaseWallet> { return this.accounts.map((account) => account.address) } - public get activeAccount(): WalletAccount | null { + public get activeAccount(): TType | null { const walletState = this.store.getWalletState() return walletState ? walletState.activeAccount : null } diff --git a/packages/core/src/wallets/custom.ts b/packages/core/src/wallets/custom.ts index 5846b4f16..e6b26ab99 100644 --- a/packages/core/src/wallets/custom.ts +++ b/packages/core/src/wallets/custom.ts @@ -38,10 +38,10 @@ const ICON = `data:image/svg+xml;base64,${btoa(` const CUSTOM_WALLET_ID = 'custom' as const -export class CustomWallet extends BaseWallet { +export class CustomWallet extends BaseWallet { private provider: CustomProvider - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) if (!params.options?.provider) { @@ -182,11 +182,11 @@ export class CustomWallet extends BaseWallet { // ---------- Factory Function ----------------------------------------- // -export function custom(options: CustomWalletOptions): WalletAdapterConfig { +export function custom(options: CustomWalletOptions): WalletAdapterConfig { return { id: CUSTOM_WALLET_ID, metadata: CustomWallet.defaultMetadata, - Adapter: CustomWallet as unknown as WalletAdapterConfig['Adapter'], + Adapter: CustomWallet as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record } } diff --git a/packages/core/src/wallets/types.ts b/packages/core/src/wallets/types.ts index 0f6874d27..7aed47c9d 100644 --- a/packages/core/src/wallets/types.ts +++ b/packages/core/src/wallets/types.ts @@ -56,14 +56,14 @@ export interface WalletCapabilities { * All mutations are pre-bound to the adapter's wallet key — * adapters cannot accidentally modify another wallet's state. */ -export interface AdapterStoreAccessor { - getWalletState(): WalletState | undefined +export interface AdapterStoreAccessor { + getWalletState(): WalletState | undefined getActiveWallet(): WalletKey | null getActiveNetwork(): string getState(): State - addWallet(wallet: WalletState): void + addWallet(wallet: WalletState): void removeWallet(): void - setAccounts(accounts: WalletAccount[]): void + setAccounts(accounts: TType[]): void setActiveAccount(address: string): void setActive(): void } @@ -73,10 +73,13 @@ export interface AdapterStoreAccessor { * Generic over the options type so adapters receive typed options * without unsafe casts. */ -export interface AdapterConstructorParams> { +export interface AdapterConstructorParams< + TType extends WalletAccount = WalletAccount, + TOptions = Record +> { id: string metadata: WalletMetadata - store: AdapterStoreAccessor + store: AdapterStoreAccessor subscribe: (callback: (state: State) => void) => () => void getAlgodClient: () => algosdk.Algodv2 options?: TOptions @@ -88,13 +91,13 @@ export interface AdapterConstructorParams> { * the manager handles heterogeneous adapter configs in a single array. * Type safety lives in the factory function signature, not here. */ -export interface WalletAdapterConfig { +export interface WalletAdapterConfig { /** Unique identifier for this wallet adapter */ id: string /** Display metadata (name, icon) */ metadata: WalletMetadata /** The adapter class constructor */ - Adapter: new (params: AdapterConstructorParams) => BaseWallet + Adapter: new (params: AdapterConstructorParams) => BaseWallet /** Wallet-specific options, passed through to the adapter constructor */ options?: Record /** Network capabilities — which networks this wallet supports */ @@ -108,17 +111,17 @@ export interface WalletAdapterConfig { * (e.g. `useWallet()` in React). Defined in core so all framework * adapters share a single type. */ -export interface Wallet { +export interface Wallet { id: string walletKey: string metadata: WalletMetadata - accounts: WalletAccount[] - activeAccount: WalletAccount | null + accounts: TType[] + activeAccount: TType | null isConnected: boolean isActive: boolean canSignData: boolean canUsePrivateKey: boolean - connect: (args?: Record) => Promise + connect: (args?: Record) => Promise disconnect: () => Promise setActive: () => void setActiveAccount: (address: string) => void @@ -126,9 +129,9 @@ export interface Wallet { // ---------- Wallet State ------------------------------------------- // -export type WalletState = { - accounts: WalletAccount[] - activeAccount: WalletAccount | null +export type WalletState = { + accounts: T[] + activeAccount: T | null } // ---------- Transaction Types -------------------------------------- // diff --git a/packages/frameworks/react/src/index.tsx b/packages/frameworks/react/src/index.tsx index 2d80bce08..bf467fc30 100644 --- a/packages/frameworks/react/src/index.tsx +++ b/packages/frameworks/react/src/index.tsx @@ -6,6 +6,7 @@ import { SignDataResponse, SignMetadata, type Wallet, + type WalletAccount, WalletManager } from '@txnlab/use-wallet' import algosdk from 'algosdk' @@ -120,7 +121,7 @@ export const useNetwork = () => { } } -export const useWallet = () => { +export const useWallet = () => { const context = React.useContext(WalletContext) if (!context) { @@ -137,14 +138,14 @@ export const useWallet = () => { const activeNetwork = useStore(manager.store, (state) => state.activeNetwork) const transformToWallet = React.useCallback( - (wallet: BaseWallet): Wallet => { + (wallet: BaseWallet): Wallet => { const walletState = walletStateMap[wallet.walletKey] return { id: wallet.id, walletKey: wallet.walletKey, metadata: wallet.metadata, - accounts: walletState?.accounts ?? [], - activeAccount: walletState?.activeAccount ?? null, + accounts: (walletState?.accounts as T[]) ?? [], + activeAccount: (walletState?.activeAccount as T) ?? null, isConnected: !!walletState, isActive: wallet.walletKey === activeWalletId, canSignData: wallet.canSignData ?? false, @@ -159,16 +160,16 @@ export const useWallet = () => { ) const wallets = React.useMemo(() => { - return [...manager.wallets.values()].map(transformToWallet) + return [...manager.wallets.values()].map((wallet) => transformToWallet(wallet)) }, [manager, transformToWallet]) const availableWallets = React.useMemo(() => { - return manager.availableWallets.map(transformToWallet) + return manager.availableWallets.map((wallet) => transformToWallet(wallet)) }, [manager, transformToWallet, activeNetwork]) const activeBaseWallet = activeWalletId ? manager.getWallet(activeWalletId) || null : null const activeWallet = React.useMemo(() => { - return activeBaseWallet ? transformToWallet(activeBaseWallet) : null + return activeBaseWallet ? transformToWallet(activeBaseWallet) : null }, [activeBaseWallet, transformToWallet]) const activeWalletAccounts = activeWallet?.accounts ?? null diff --git a/packages/frameworks/solid/src/index.tsx b/packages/frameworks/solid/src/index.tsx index 3436438b6..b6517edbb 100644 --- a/packages/frameworks/solid/src/index.tsx +++ b/packages/frameworks/solid/src/index.tsx @@ -15,17 +15,17 @@ import type { export * from '@txnlab/use-wallet' -export interface Wallet { +export interface Wallet { id: string walletKey: WalletKey metadata: WalletMetadata - readonly accounts: WalletAccount[] - readonly activeAccount: WalletAccount | null + readonly accounts: T[] + readonly activeAccount: T | null readonly isConnected: boolean readonly isActive: boolean canSignData: boolean canUsePrivateKey: boolean - connect: (args?: Record) => Promise + connect: (args?: Record) => Promise disconnect: () => Promise setActive: () => void setActiveAccount: (address: string) => void @@ -138,7 +138,7 @@ export const useNetwork = () => { } } -export const useWallet = () => { +export const useWallet = () => { const manager = createMemo(() => useWalletManager()) const managerStatus = useStore(manager().store, (state) => state.managerStatus) @@ -148,16 +148,16 @@ export const useWallet = () => { const walletStateMap = useStore(manager().store, (state) => state.wallets) const activeWalletId = useStore(manager().store, (state) => state.activeWallet) - const transformToWallet = (wallet: BaseWallet): Wallet => { + const transformToWallet = (wallet: BaseWallet): Wallet => { return { id: wallet.id, walletKey: wallet.walletKey, metadata: wallet.metadata, get accounts() { - return walletStateMap()[wallet.walletKey]?.accounts ?? [] + return (walletStateMap()[wallet.walletKey]?.accounts as T[]) ?? [] }, get activeAccount() { - return walletStateMap()[wallet.walletKey]?.activeAccount ?? null + return (walletStateMap()[wallet.walletKey]?.activeAccount as T) ?? null }, get isConnected() { return !!walletStateMap()[wallet.walletKey] @@ -174,7 +174,7 @@ export const useWallet = () => { } } - const wallets = [...manager().wallets].map(transformToWallet) + const wallets = [...manager().wallets].map((wallet) => transformToWallet(wallet)) const activeNetwork = useStore(manager().store, (state) => state.activeNetwork) @@ -193,7 +193,7 @@ export const useWallet = () => { const activeWallet = createMemo(() => { const id = activeWalletId() - return id ? (wallets.find((w) => w.walletKey === id) ?? null) : null + return id ? ((wallets.find((w) => w.walletKey === id) as Wallet) ?? null) : null }) const activeWalletAccounts = createMemo(() => { diff --git a/packages/frameworks/svelte/src/index.ts b/packages/frameworks/svelte/src/index.ts index 4ec1c2b30..2f941dc33 100644 --- a/packages/frameworks/svelte/src/index.ts +++ b/packages/frameworks/svelte/src/index.ts @@ -109,31 +109,34 @@ export const useNetwork = () => { } } -export interface Wallet { +export interface Wallet { id: string walletKey: WalletKey metadata: WalletMetadata - accounts: { current: WalletAccount[] | undefined } + accounts: { current: T[] | undefined } isConnected: () => boolean isActive: () => boolean canSignData: boolean canUsePrivateKey: boolean - connect: (args?: Record) => Promise + connect: (args?: Record) => Promise disconnect: () => Promise setActive: () => void setActiveAccount: (address: string) => void } -export const useWallet = () => { +export const useWallet = () => { const manager = useWalletManager() const walletStore = useStore(manager.store, (state) => state.wallets) - const transformToWallet = (wallet: BaseWallet): Wallet => { + const transformToWallet = (wallet: BaseWallet): Wallet => { return { id: wallet.id, walletKey: wallet.walletKey, metadata: wallet.metadata, - accounts: useStore(manager.store, (state) => state.wallets[wallet.walletKey]?.accounts), + accounts: useStore( + manager.store, + (state) => state.wallets[wallet.walletKey]?.accounts as T[] | undefined + ), isConnected: () => !!walletStore.current[wallet.walletKey], isActive: () => wallet.walletKey === activeWalletId.current, canSignData: wallet.canSignData ?? false, @@ -145,7 +148,7 @@ export const useWallet = () => { } } - const wallets = [...manager.wallets].map(transformToWallet) + const wallets = [...manager.wallets].map((wallet) => transformToWallet(wallet)) const activeNetwork = useStore(manager.store, (state) => state.activeNetwork) const availableWallets = { get current() { @@ -160,17 +163,17 @@ export const useWallet = () => { const managerStatus = useStore(manager.store, (state) => state.managerStatus) const isReady = () => managerStatus.current === 'ready' const algodClient = useStore(manager.store, (state) => state.algodClient) - const activeWallet = () => wallets.find((w) => w.walletKey === activeWalletId.current) + const activeWallet = () => wallets.find((w) => w.walletKey === activeWalletId.current) as Wallet | undefined const activeWalletAccounts = useStore( manager.store, - (state) => state.wallets[activeWalletId.current!]?.accounts + (state) => state.wallets[activeWalletId.current!]?.accounts as T[] | undefined ) const activeWalletAddresses = useStore(manager.store, (state) => state.wallets[activeWalletId.current!]?.accounts.map((account) => account.address) ) const activeAccount = useStore( manager.store, - (state) => state.wallets[activeWalletId.current!]?.activeAccount + (state) => state.wallets[activeWalletId.current!]?.activeAccount as T | undefined ) const activeAddress = useStore( manager.store, diff --git a/packages/frameworks/vue/src/useWallet.ts b/packages/frameworks/vue/src/useWallet.ts index 3ba892368..28d8a7b99 100644 --- a/packages/frameworks/vue/src/useWallet.ts +++ b/packages/frameworks/vue/src/useWallet.ts @@ -3,6 +3,7 @@ import { BaseWallet, WalletManager, type Wallet, + type WalletAccount, type SignMetadata, type SignDataResponse } from '@txnlab/use-wallet' @@ -11,7 +12,7 @@ import { computed, inject, ref } from 'vue' export type SetAlgodClient = (client: algosdk.Algodv2) => void -export function useWallet() { +export function useWallet() { const manager = inject('walletManager') const algodClient = inject>>('algodClient') @@ -28,14 +29,14 @@ export function useWallet() { const walletStateMap = useStore(manager.store, (state) => state.wallets) const activeWalletId = useStore(manager.store, (state) => state.activeWallet) - const transformToWallet = (wallet: BaseWallet): Wallet => { + const transformToWallet = (wallet: BaseWallet): Wallet => { const walletState = walletStateMap.value[wallet.walletKey] return { id: wallet.id, walletKey: wallet.walletKey, metadata: wallet.metadata, - accounts: walletState?.accounts ?? [], - activeAccount: walletState?.activeAccount ?? null, + accounts: (walletState?.accounts as T[]) ?? [], + activeAccount: (walletState?.activeAccount as T) ?? null, isConnected: !!walletState, isActive: wallet.walletKey === activeWalletId.value, canSignData: wallet.canSignData ?? false, @@ -48,7 +49,7 @@ export function useWallet() { } const wallets = computed(() => { - return [...manager.wallets.values()].map(transformToWallet) + return [...manager.wallets.values()].map((wallet) => transformToWallet(wallet)) }) const activeNetwork = useStore(manager.store, (state) => state.activeNetwork) @@ -56,12 +57,12 @@ export function useWallet() { const availableWallets = computed(() => { // Access activeNetwork.value to trigger recomputation on network change void activeNetwork.value - return manager.availableWallets.map(transformToWallet) + return manager.availableWallets.map((wallet) => transformToWallet(wallet)) }) const activeWallet = computed(() => { const wallet = activeWalletId.value ? manager.getWallet(activeWalletId.value) || null : null - return wallet ? transformToWallet(wallet) : null + return wallet ? transformToWallet(wallet) : null }) const activeBaseWallet = computed(() => { diff --git a/packages/wallets/defly-web/src/adapter.ts b/packages/wallets/defly-web/src/adapter.ts index f5cae6a4f..a5513cc59 100644 --- a/packages/wallets/defly-web/src/adapter.ts +++ b/packages/wallets/defly-web/src/adapter.ts @@ -1,15 +1,17 @@ -import { AVMProvider } from './avm-provider' +import { AVMProvider, type AVMAccount } from './avm-provider' import type { AdapterConstructorParams, WalletMetadata } from '@txnlab/use-wallet/adapter' import type AVMWebProviderSDK from '@agoralabs-sh/avm-web-provider' const PROVIDER_ID = '95426e60-5f2e-49e9-b912-c488577be962' +export type DeflyWebAccount = AVMAccount + import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` export class DeflyWebAdapter extends AVMProvider { - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super({ ...params, providerId: PROVIDER_ID }) } diff --git a/packages/wallets/defly-web/src/avm-provider.ts b/packages/wallets/defly-web/src/avm-provider.ts index cf9c0ee8b..b01d5c5e9 100644 --- a/packages/wallets/defly-web/src/avm-provider.ts +++ b/packages/wallets/defly-web/src/avm-provider.ts @@ -17,12 +17,14 @@ export function isAVMWebProviderSDKError(error: any): error is AVMWebProviderSDK return typeof error === 'object' && 'code' in error && 'message' in error } -export abstract class AVMProvider extends BaseWallet { +export type AVMAccount = WalletAccount + +export abstract class AVMProvider extends BaseWallet { public avmWebClient: AVMWebProviderSDK.AVMWebClient | null = null protected avmWebProviderSDK: typeof AVMWebProviderSDK | null = null protected providerId: string - constructor(params: AdapterConstructorParams & { providerId: string }) { + constructor(params: AdapterConstructorParams & { providerId: string }) { super(params) this.providerId = params.providerId } @@ -82,7 +84,7 @@ export abstract class AVMProvider extends BaseWallet { protected _mapAVMWebProviderAccountToWalletAccounts( accounts: AVMWebProviderSDK.IAccount[] - ): WalletAccount[] { + ): AVMAccount[] { return accounts.map(({ address, name }, idx) => ({ name: name || `[${this.metadata.name}] Account ${idx + 1}`, address @@ -156,7 +158,7 @@ export abstract class AVMProvider extends BaseWallet { * Common methods * These methods can be overridden by specific wallet providers if needed */ - public async connect(): Promise { + public async connect(): Promise { try { this.logger.info('Connecting...') const result = await this._enable() @@ -164,7 +166,7 @@ export abstract class AVMProvider extends BaseWallet { const walletAccounts = this._mapAVMWebProviderAccountToWalletAccounts(result.accounts) - const walletState: WalletState = { + const walletState: WalletState = { accounts: walletAccounts, activeAccount: walletAccounts[0] } diff --git a/packages/wallets/defly-web/src/index.ts b/packages/wallets/defly-web/src/index.ts index 575ec77f2..4d0698f51 100644 --- a/packages/wallets/defly-web/src/index.ts +++ b/packages/wallets/defly-web/src/index.ts @@ -1,15 +1,17 @@ import { DeflyWebAdapter } from './adapter' +import type { DeflyWebAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'defly-web' as const -export function deflyWeb(): WalletAdapterConfig { +export function deflyWeb(): WalletAdapterConfig { return { id: WALLET_ID, metadata: DeflyWebAdapter.defaultMetadata, - Adapter: DeflyWebAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: DeflyWebAdapter as unknown as WalletAdapterConfig['Adapter'], capabilities: { supportedNetworks: ['mainnet', 'testnet'] } } } export { DeflyWebAdapter } +export type { DeflyWebAccount } diff --git a/packages/wallets/defly/src/adapter.ts b/packages/wallets/defly/src/adapter.ts index 8fd7a1988..de5e549df 100644 --- a/packages/wallets/defly/src/adapter.ts +++ b/packages/wallets/defly/src/adapter.ts @@ -19,14 +19,16 @@ export interface DeflyOptions { chainId?: 416001 | 416002 | 416003 | 4160 } +export type DeflyAccount = WalletAccount + import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class DeflyAdapter extends BaseWallet { +export class DeflyAdapter extends BaseWallet { private client: DeflyWalletConnect | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) } @@ -65,7 +67,7 @@ export class DeflyAdapter extends BaseWallet { } } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') const currentActiveWallet = this.store.getActiveWallet() if (currentActiveWallet && currentActiveWallet !== this.id) { @@ -82,14 +84,14 @@ export class DeflyAdapter extends BaseWallet { throw new Error('No accounts found!') } - const walletAccounts = accounts.map((address: string, idx: number) => ({ + const walletAccounts: DeflyAccount[] = accounts.map((address: string, idx: number) => ({ name: `${this.metadata.name} Account ${idx + 1}`, address })) const activeAccount = walletAccounts[0] - const walletState: WalletState = { + const walletState: WalletState = { accounts: walletAccounts, activeAccount } diff --git a/packages/wallets/defly/src/index.ts b/packages/wallets/defly/src/index.ts index c15f9cc5b..66a39a188 100644 --- a/packages/wallets/defly/src/index.ts +++ b/packages/wallets/defly/src/index.ts @@ -1,18 +1,18 @@ import { DeflyAdapter } from './adapter' -import type { DeflyOptions } from './adapter' +import type { DeflyOptions, DeflyAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'defly' as const -export function defly(options?: DeflyOptions): WalletAdapterConfig { +export function defly(options?: DeflyOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: DeflyAdapter.defaultMetadata, - Adapter: DeflyAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: DeflyAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined, capabilities: { supportedNetworks: ['mainnet', 'testnet'] } } } export { DeflyAdapter } -export type { DeflyOptions } +export type { DeflyOptions, DeflyAccount } diff --git a/packages/wallets/exodus/src/adapter.ts b/packages/wallets/exodus/src/adapter.ts index be65e04fe..ec7d5e6b6 100644 --- a/packages/wallets/exodus/src/adapter.ts +++ b/packages/wallets/exodus/src/adapter.ts @@ -26,6 +26,8 @@ interface EnableAccountsOpts { export type ExodusOptions = EnableNetworkOpts & EnableAccountsOpts +export type ExodusAccount = WalletAccount + interface EnableNetworkResult { genesisID: string genesisHash: string @@ -52,10 +54,10 @@ import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class ExodusAdapter extends BaseWallet { +export class ExodusAdapter extends BaseWallet { private client: Exodus | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) } @@ -76,7 +78,7 @@ export class ExodusAdapter extends BaseWallet { return client } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') const client = this.client || (await this.initializeClient()) const { accounts } = await client.enable(this.options) @@ -86,14 +88,14 @@ export class ExodusAdapter extends BaseWallet { throw new Error('No accounts found!') } - const walletAccounts = accounts.map((address: string, idx: number) => ({ + const walletAccounts: ExodusAccount[] = accounts.map((address: string, idx: number) => ({ name: `${this.metadata.name} Account ${idx + 1}`, address })) const activeAccount = walletAccounts[0] - const walletState: WalletState = { + const walletState: WalletState = { accounts: walletAccounts, activeAccount } diff --git a/packages/wallets/exodus/src/index.ts b/packages/wallets/exodus/src/index.ts index b81503db4..50530c3ea 100644 --- a/packages/wallets/exodus/src/index.ts +++ b/packages/wallets/exodus/src/index.ts @@ -1,18 +1,18 @@ import { ExodusAdapter } from './adapter' -import type { ExodusOptions } from './adapter' +import type { ExodusOptions, ExodusAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'exodus' as const -export function exodus(options?: ExodusOptions): WalletAdapterConfig { +export function exodus(options?: ExodusOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: ExodusAdapter.defaultMetadata, - Adapter: ExodusAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: ExodusAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined, capabilities: { supportedNetworks: ['mainnet'] } } } export { ExodusAdapter } -export type { ExodusOptions } +export type { ExodusOptions, ExodusAccount } diff --git a/packages/wallets/kibisis/src/adapter.ts b/packages/wallets/kibisis/src/adapter.ts index 32bbeb241..2c4fc8045 100644 --- a/packages/wallets/kibisis/src/adapter.ts +++ b/packages/wallets/kibisis/src/adapter.ts @@ -1,15 +1,17 @@ -import { AVMProvider } from './avm-provider' +import { AVMProvider, type AVMAccount } from './avm-provider' import type { AdapterConstructorParams, WalletMetadata } from '@txnlab/use-wallet/adapter' import type AVMWebProviderSDK from '@agoralabs-sh/avm-web-provider' const PROVIDER_ID = 'f6d1c86b-4493-42fb-b88d-a62407b4cdf6' +export type KibisisAccount = AVMAccount + import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` export class KibisisAdapter extends AVMProvider { - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super({ ...params, providerId: PROVIDER_ID }) } diff --git a/packages/wallets/kibisis/src/index.ts b/packages/wallets/kibisis/src/index.ts index cd3eea806..74c85513b 100644 --- a/packages/wallets/kibisis/src/index.ts +++ b/packages/wallets/kibisis/src/index.ts @@ -1,14 +1,16 @@ import { KibisisAdapter } from './adapter' +import type { KibisisAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'kibisis' as const -export function kibisis(): WalletAdapterConfig { +export function kibisis(): WalletAdapterConfig { return { id: WALLET_ID, metadata: KibisisAdapter.defaultMetadata, - Adapter: KibisisAdapter as unknown as WalletAdapterConfig['Adapter'] + Adapter: KibisisAdapter as unknown as WalletAdapterConfig['Adapter'] } } export { KibisisAdapter } +export type { KibisisAccount } diff --git a/packages/wallets/kmd/src/adapter.ts b/packages/wallets/kmd/src/adapter.ts index 0da6f880b..4f8b27ff8 100644 --- a/packages/wallets/kmd/src/adapter.ts +++ b/packages/wallets/kmd/src/adapter.ts @@ -23,6 +23,8 @@ export type KmdOptions = Partial { +export class KmdAdapter extends BaseWallet { private client: algosdk.Kmd | null = null private kmdOptions: KmdConstructor private walletName: string private kmdWalletId: string = '' private password: string | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) const { @@ -90,7 +92,7 @@ export class KmdAdapter extends BaseWallet { return client } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') if (!this.client) { await this.initializeClient() @@ -105,14 +107,14 @@ export class KmdAdapter extends BaseWallet { throw new Error('No accounts found!') } - const walletAccounts = accounts.map((address: string, idx: number) => ({ + const walletAccounts: KmdAccount[] = accounts.map((address: string, idx: number) => ({ name: `${this.metadata.name} Account ${idx + 1}`, address })) const activeAccount = walletAccounts[0] - const walletState: WalletState = { + const walletState: WalletState = { accounts: walletAccounts, activeAccount } diff --git a/packages/wallets/kmd/src/index.ts b/packages/wallets/kmd/src/index.ts index 2d399b5eb..2784bf143 100644 --- a/packages/wallets/kmd/src/index.ts +++ b/packages/wallets/kmd/src/index.ts @@ -1,17 +1,17 @@ import { KmdAdapter } from './adapter' -import type { KmdOptions } from './adapter' +import type { KmdOptions, KmdAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'kmd' as const -export function kmd(options?: KmdOptions): WalletAdapterConfig { +export function kmd(options?: KmdOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: KmdAdapter.defaultMetadata, - Adapter: KmdAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: KmdAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined } } export { KmdAdapter } -export type { KmdOptions } +export type { KmdOptions, KmdAccount } diff --git a/packages/wallets/lute/src/adapter.ts b/packages/wallets/lute/src/adapter.ts index 42b31ddeb..72c69766f 100644 --- a/packages/wallets/lute/src/adapter.ts +++ b/packages/wallets/lute/src/adapter.ts @@ -25,6 +25,8 @@ export interface LuteConnectOptions { siteName?: string } +export type LuteAccount = WalletAccount + function isSignTxnsError(error: any): error is ISignTxnsError { return error instanceof Error && 'code' in error } @@ -37,10 +39,10 @@ import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class LuteAdapter extends BaseWallet { +export class LuteAdapter extends BaseWallet { private client: LuteConnect | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) } @@ -74,7 +76,7 @@ export class LuteAdapter extends BaseWallet { return `${genesis.network}-${genesis.id}` } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') const client = this.client || (await this.initializeClient()) const genesisId = await this.getGenesisId() @@ -85,14 +87,14 @@ export class LuteAdapter extends BaseWallet { throw new Error('No accounts found!') } - const walletAccounts = accounts.map((address: string, idx: number) => ({ + const walletAccounts: LuteAccount[] = accounts.map((address: string, idx: number) => ({ name: `${this.metadata.name} Account ${idx + 1}`, address })) const activeAccount = walletAccounts[0] - const walletState: WalletState = { + const walletState: WalletState = { accounts: walletAccounts, activeAccount } diff --git a/packages/wallets/lute/src/index.ts b/packages/wallets/lute/src/index.ts index 8a4d95444..ef3d4e351 100644 --- a/packages/wallets/lute/src/index.ts +++ b/packages/wallets/lute/src/index.ts @@ -1,17 +1,17 @@ import { LuteAdapter } from './adapter' -import type { LuteConnectOptions } from './adapter' +import type { LuteConnectOptions, LuteAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'lute' as const -export function lute(options?: LuteConnectOptions): WalletAdapterConfig { +export function lute(options?: LuteConnectOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: LuteAdapter.defaultMetadata, - Adapter: LuteAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: LuteAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined } } export { LuteAdapter } -export type { LuteConnectOptions } +export type { LuteConnectOptions, LuteAccount } diff --git a/packages/wallets/magic/src/adapter.ts b/packages/wallets/magic/src/adapter.ts index bd12767e0..ad20ef414 100644 --- a/packages/wallets/magic/src/adapter.ts +++ b/packages/wallets/magic/src/adapter.ts @@ -21,6 +21,8 @@ export interface MagicAuthOptions { apiKey?: string } +export type MagicAccount = WalletAccount + export type MagicAuthClient = InstanceWithExtensions< SDKBase, { @@ -34,12 +36,12 @@ import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class MagicAdapter extends BaseWallet { +export class MagicAdapter extends BaseWallet { private client: MagicAuthClient | null = null public userInfo: MagicUserMetadata | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) if (!params.options?.apiKey) { this.logger.error('Missing required option: apiKey') @@ -68,7 +70,7 @@ export class MagicAdapter extends BaseWallet { return client } - public connect = async (args?: Record): Promise => { + public connect = async (args?: Record): Promise => { this.logger.info('Connecting...') if (!args?.email || typeof args.email !== 'string') { this.logger.error('Magic Link provider requires an email (string) to connect') @@ -99,12 +101,12 @@ export class MagicAdapter extends BaseWallet { this.userInfo = userInfo this.logger.info('Login successful', userInfo) - const walletAccount: WalletAccount = { + const walletAccount: MagicAccount = { name: userInfo.email ?? 'Magic Wallet 1', address: publicAddress } - const walletState: WalletState = { + const walletState: WalletState = { accounts: [walletAccount], activeAccount: walletAccount } diff --git a/packages/wallets/magic/src/index.ts b/packages/wallets/magic/src/index.ts index 01e526d9d..ab614505b 100644 --- a/packages/wallets/magic/src/index.ts +++ b/packages/wallets/magic/src/index.ts @@ -1,18 +1,18 @@ import { MagicAdapter } from './adapter' -import type { MagicAuthOptions } from './adapter' +import type { MagicAuthOptions, MagicAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'magic' as const -export function magic(options?: MagicAuthOptions): WalletAdapterConfig { +export function magic(options?: MagicAuthOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: MagicAdapter.defaultMetadata, - Adapter: MagicAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: MagicAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined, capabilities: { supportedNetworks: ['mainnet'] } } } export { MagicAdapter } -export type { MagicAuthOptions, MagicAuthClient } from './adapter' +export type { MagicAuthOptions, MagicAccount, MagicAuthClient } from './adapter' diff --git a/packages/wallets/mnemonic/src/adapter.ts b/packages/wallets/mnemonic/src/adapter.ts index cb7fce6f8..6ccc2946d 100644 --- a/packages/wallets/mnemonic/src/adapter.ts +++ b/packages/wallets/mnemonic/src/adapter.ts @@ -19,17 +19,19 @@ interface MnemonicConstructor { export type MnemonicOptions = Partial> & Omit +export type MnemonicAccount = WalletAccount + export const LOCAL_STORAGE_MNEMONIC_KEY = '@txnlab/use-wallet:v5_mnemonic' import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class MnemonicAdapter extends BaseWallet { +export class MnemonicAdapter extends BaseWallet { private account: algosdk.Account | null = null private mnemonicOptions: MnemonicConstructor - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) const { @@ -102,19 +104,19 @@ export class MnemonicAdapter extends BaseWallet { return account } - public connect = async (): Promise => { + public connect = async (): Promise => { // Throw error if MainNet is active this.checkMainnet() this.logger.info('Connecting...') const account = await this.initializeAccount() - const walletAccount = { + const walletAccount: MnemonicAccount = { name: `${this.metadata.name} Account`, address: account.addr.toString() } - const walletState: WalletState = { + const walletState: WalletState = { accounts: [walletAccount], activeAccount: walletAccount } diff --git a/packages/wallets/mnemonic/src/index.ts b/packages/wallets/mnemonic/src/index.ts index f00d0c8bb..87099160c 100644 --- a/packages/wallets/mnemonic/src/index.ts +++ b/packages/wallets/mnemonic/src/index.ts @@ -1,18 +1,18 @@ import { MnemonicAdapter } from './adapter' -import type { MnemonicOptions } from './adapter' +import type { MnemonicOptions, MnemonicAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'mnemonic' as const -export function mnemonic(options?: MnemonicOptions): WalletAdapterConfig { +export function mnemonic(options?: MnemonicOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: MnemonicAdapter.defaultMetadata, - Adapter: MnemonicAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: MnemonicAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined, capabilities: { excludedNetworks: ['mainnet'] } } } export { MnemonicAdapter } -export type { MnemonicOptions } +export type { MnemonicOptions, MnemonicAccount } diff --git a/packages/wallets/pera/src/adapter.ts b/packages/wallets/pera/src/adapter.ts index 457d6b1fc..eb484daca 100644 --- a/packages/wallets/pera/src/adapter.ts +++ b/packages/wallets/pera/src/adapter.ts @@ -20,14 +20,16 @@ export interface PeraOptions { compactMode?: boolean } +export type PeraAccount = WalletAccount + import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class PeraAdapter extends BaseWallet { +export class PeraAdapter extends BaseWallet { private client: PeraWalletConnect | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) } @@ -66,7 +68,7 @@ export class PeraAdapter extends BaseWallet { } } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') const currentActiveWallet = this.store.getActiveWallet() if (currentActiveWallet && currentActiveWallet !== this.id) { @@ -83,14 +85,14 @@ export class PeraAdapter extends BaseWallet { throw new Error('No accounts found!') } - const walletAccounts = accounts.map((address: string, idx: number) => ({ + const walletAccounts: PeraAccount[] = accounts.map((address: string, idx: number) => ({ name: `${this.metadata.name} Account ${idx + 1}`, address })) const activeAccount = walletAccounts[0] - const walletState: WalletState = { + const walletState: WalletState = { accounts: walletAccounts, activeAccount } diff --git a/packages/wallets/pera/src/index.ts b/packages/wallets/pera/src/index.ts index abb3fbc77..7f0c6847c 100644 --- a/packages/wallets/pera/src/index.ts +++ b/packages/wallets/pera/src/index.ts @@ -1,18 +1,18 @@ import { PeraAdapter } from './adapter' -import type { PeraOptions } from './adapter' +import type { PeraOptions, PeraAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'pera' as const -export function pera(options?: PeraOptions): WalletAdapterConfig { +export function pera(options?: PeraOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: PeraAdapter.defaultMetadata, - Adapter: PeraAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: PeraAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined, capabilities: { supportedNetworks: ['mainnet', 'testnet'] } } } export { PeraAdapter } -export type { PeraOptions } +export type { PeraOptions, PeraAccount } diff --git a/packages/wallets/w3wallet/src/adapter.ts b/packages/wallets/w3wallet/src/adapter.ts index 204b72a80..5ec21754b 100644 --- a/packages/wallets/w3wallet/src/adapter.ts +++ b/packages/wallets/w3wallet/src/adapter.ts @@ -13,9 +13,11 @@ import { type WalletTransaction } from '@txnlab/use-wallet/adapter' +export type W3WalletAccount = WalletAccount + export interface W3WalletProvider { isConnected: () => Promise - account: () => Promise + account: () => Promise signTxns: (transactions: WalletTransaction[]) => Promise<(string | null)[]> } @@ -25,10 +27,10 @@ import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class W3WalletAdapter extends BaseWallet { +export class W3WalletAdapter extends BaseWallet { private client: W3WalletProvider | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) } @@ -52,13 +54,13 @@ export class W3WalletAdapter extends BaseWallet { return client } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') const client = this.client || (await this.initializeClient()) const activeAccount = await client.account() - const walletState: WalletState = { + const walletState: WalletState = { accounts: [activeAccount], activeAccount } diff --git a/packages/wallets/w3wallet/src/index.ts b/packages/wallets/w3wallet/src/index.ts index 384afd31d..ee100a884 100644 --- a/packages/wallets/w3wallet/src/index.ts +++ b/packages/wallets/w3wallet/src/index.ts @@ -1,16 +1,17 @@ import { W3WalletAdapter } from './adapter' +import type { W3WalletAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'w3wallet' as const -export function w3wallet(): WalletAdapterConfig { +export function w3wallet(): WalletAdapterConfig { return { id: WALLET_ID, metadata: W3WalletAdapter.defaultMetadata, - Adapter: W3WalletAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: W3WalletAdapter as unknown as WalletAdapterConfig['Adapter'], capabilities: { supportedNetworks: ['mainnet'] } } } export { W3WalletAdapter } -export type { W3WalletProvider } from './adapter' +export type { W3WalletProvider, W3WalletAccount } from './adapter' diff --git a/packages/wallets/walletconnect/src/adapter.ts b/packages/wallets/walletconnect/src/adapter.ts index 2151b91c9..32e541fbb 100644 --- a/packages/wallets/walletconnect/src/adapter.ts +++ b/packages/wallets/walletconnect/src/adapter.ts @@ -50,6 +50,8 @@ export interface WalletConnectOptions extends WalletConnectBaseOptions { skin?: WalletConnectSkinOption } +export type WalletConnectAccount = WalletAccount + export type SignTxnsResponse = Array export class SessionError extends Error { @@ -63,14 +65,17 @@ import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class WalletConnectAdapter extends BaseWallet { +export class WalletConnectAdapter extends BaseWallet< + WalletConnectAccount, + WalletConnectOptions +> { private client: SignClient | null = null private clientOptions: SignClientOptions private modal: WalletConnectModal | null = null private modalOptions: WalletConnectModalOptions private session: SessionTypes.Struct | null = null - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) if (!this.options?.projectId) { @@ -302,7 +307,7 @@ export class WalletConnectAdapter extends BaseWallet { return modal } - private onSessionConnected(session: SessionTypes.Struct): WalletAccount[] { + private onSessionConnected(session: SessionTypes.Struct): WalletConnectAccount[] { const caipAccounts = session.namespaces.algorand!.accounts if (!caipAccounts.length) { @@ -315,7 +320,7 @@ export class WalletConnectAdapter extends BaseWallet { // Filter duplicate accounts (same address, different chain) const accounts = [...new Set(caipAccounts.map((account) => account.split(':').pop()!))] - const walletAccounts = accounts.map((address: string, idx: number) => ({ + const walletAccounts: WalletConnectAccount[] = accounts.map((address: string, idx: number) => ({ name: `${this.metadata.name} Account ${idx + 1}`, address })) @@ -323,7 +328,7 @@ export class WalletConnectAdapter extends BaseWallet { const walletState = this.store.getWalletState() if (!walletState) { - const newWalletState: WalletState = { + const newWalletState: WalletState = { accounts: walletAccounts, activeAccount: walletAccounts[0] } @@ -356,7 +361,7 @@ export class WalletConnectAdapter extends BaseWallet { return network.caipChainId } - public connect = async (): Promise => { + public connect = async (): Promise => { this.logger.info('Connecting...') try { const client = this.client || (await this.initializeClient()) diff --git a/packages/wallets/walletconnect/src/index.ts b/packages/wallets/walletconnect/src/index.ts index 3fec3e754..6dc73c773 100644 --- a/packages/wallets/walletconnect/src/index.ts +++ b/packages/wallets/walletconnect/src/index.ts @@ -1,11 +1,11 @@ import { WalletConnectAdapter } from './adapter' import { resolveSkin } from './skins' -import type { WalletConnectOptions } from './adapter' +import type { WalletConnectOptions, WalletConnectAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'walletconnect' as const -export function walletConnect(options: WalletConnectOptions): WalletAdapterConfig { +export function walletConnect(options: WalletConnectOptions): WalletAdapterConfig { const skin = options.skin ? resolveSkin(options.skin) : null const id = skin ? `walletconnect:${skin.id}` : WALLET_ID const metadata = skin @@ -15,14 +15,14 @@ export function walletConnect(options: WalletConnectOptions): WalletAdapterConfi return { id, metadata, - Adapter: WalletConnectAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: WalletConnectAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record | undefined } } export { WalletConnectAdapter } export { SessionError } from './adapter' -export type { WalletConnectOptions, SignTxnsResponse } from './adapter' +export type { WalletConnectOptions, WalletConnectAccount, SignTxnsResponse } from './adapter' // Skins utilities and types export { registerSkin, getSkin, resolveSkin, BUILTIN_SKINS } from './skins' diff --git a/packages/wallets/web3auth/src/adapter.ts b/packages/wallets/web3auth/src/adapter.ts index 4c7483211..21d9809fd 100644 --- a/packages/wallets/web3auth/src/adapter.ts +++ b/packages/wallets/web3auth/src/adapter.ts @@ -199,11 +199,13 @@ export interface Web3AuthOptions { getAuthCredentials?: () => Promise } +export type Web3AuthAccount = WalletAccount + import { icon } from './icon' const ICON = `data:image/svg+xml;base64,${btoa(icon)}` -export class Web3AuthAdapter extends BaseWallet { +export class Web3AuthAdapter extends BaseWallet { private web3auth: IWeb3AuthModal | null = null private web3authSFA: IWeb3AuthSFA | null = null private userInfo: Partial | null = null @@ -217,7 +219,7 @@ export class Web3AuthAdapter extends BaseWallet { /** Track which SDK is currently in use */ private usingSFA: boolean = false - constructor(params: AdapterConstructorParams) { + constructor(params: AdapterConstructorParams) { super(params) if (!params.options?.clientId) { @@ -627,7 +629,7 @@ export class Web3AuthAdapter extends BaseWallet { * verifier: 'my-firebase-verifier' * }) */ - public connect = async (args?: Record): Promise => { + public connect = async (args?: Record): Promise => { this.logger.info('Connecting to Web3Auth...') try { @@ -711,12 +713,12 @@ export class Web3AuthAdapter extends BaseWallet { keyContainer.clear() } - const walletAccount: WalletAccount = { + const walletAccount: Web3AuthAccount = { name: this.userInfo.name || this.userInfo.email || `${this.metadata.name} Account`, address: this._address } - const walletState: WalletState = { + const walletState: WalletState = { accounts: [walletAccount], activeAccount: walletAccount } diff --git a/packages/wallets/web3auth/src/index.ts b/packages/wallets/web3auth/src/index.ts index ec5c07b08..8bf635104 100644 --- a/packages/wallets/web3auth/src/index.ts +++ b/packages/wallets/web3auth/src/index.ts @@ -1,18 +1,18 @@ import { Web3AuthAdapter } from './adapter' -import type { Web3AuthOptions } from './adapter' +import type { Web3AuthOptions, Web3AuthAccount } from './adapter' import type { WalletAdapterConfig } from '@txnlab/use-wallet' export const WALLET_ID = 'web3auth' as const -export function web3auth(options: Web3AuthOptions): WalletAdapterConfig { +export function web3auth(options: Web3AuthOptions): WalletAdapterConfig { return { id: WALLET_ID, metadata: Web3AuthAdapter.defaultMetadata, - Adapter: Web3AuthAdapter as unknown as WalletAdapterConfig['Adapter'], + Adapter: Web3AuthAdapter as unknown as WalletAdapterConfig['Adapter'], options: options as unknown as Record, capabilities: { supportedNetworks: ['mainnet'] } } } export { Web3AuthAdapter } -export type { Web3AuthOptions, Web3AuthCustomAuth, Web3AuthCredentials } from './adapter' +export type { Web3AuthOptions, Web3AuthAccount, Web3AuthCustomAuth, Web3AuthCredentials } from './adapter'