# Wallet

The `useWallet` hook provides a unified interface for managing wallet connections in a VeChain application, supporting multiple connection methods including social logins (via Privy), direct wallet connections (via DappKit), and cross-application connections.

This will be the hook you will use more frequently and it provides quite a few useful informations.

### Usage

```typescript
import { useWallet } from "@vechain/vechain-kit"; 

function MyComponent = () => {
    const {
        account,
        connectedWallet,
        smartAccount,
        privyUser,
        connection,
        disconnect
    } = useWallet();
    
    return <></>
}


```

### Types

{% tabs %}
{% tab title="Wallet" %}

```typescript
export type Wallet = {
    address: string;
    domain?: string;
    image: string;
} | null;
```

{% endtab %}

{% tab title="SmartAccount" %}

```typescript
export type SmartAccount = Wallet & {
    isDeployed: boolean;
    isActive: boolean;
    version: string | null;
};
```

{% endtab %}

{% tab title="Connection source" %}

```typescript
export type ConnectionSource = {
    type: 'privy' | 'wallet' | 'privy-cross-app';
    displayName: string;
};
```

{% endtab %}

{% tab title="PrivyUser" %}

```typescript
interface User {
    /** The Privy-issued DID for the user. If you need to store additional information
     * about a user, you can use this DID to reference them. */
    id: string;
    /** The datetime of when the user was created. */
    createdAt: Date;
    /** The user's email address, if they have linked one. It cannot be linked to another user. */
    email?: Email;
    /** The user's phone number, if they have linked one. It cannot be linked to another user. */
    phone?: Phone;
    /** The user's most recently linked wallet, if they have linked at least one wallet.
     *  It cannot be linked to another user.
     *  This wallet is the wallet that will be used for transactions and signing if it is connected.
     **/
    wallet?: Wallet;
    /**
     * The user's smart wallet, if they have set up through the Privy Smart Wallet SDK.
     */
    smartWallet?: SmartWallet;
    /** The user's Google account, if they have linked one. It cannot be linked to another user. */
    google?: Google;
    /** The user's Twitter account, if they have linked one. It cannot be linked to another user. */
    twitter?: Twitter;
    /** The user's Discord account, if they have linked one. It cannot be linked to another user. */
    discord?: Discord;
    /** The user's Github account, if they have linked one. It cannot be linked to another user. */
    github?: Github;
    /** The user's Spotify account, if they have linked one. It cannot be linked to another user. */
    spotify?: Spotify;
    /** The user's Instagram account, if they have linked one. It cannot be linked to another user. */
    instagram?: Instagram;
    /** The user's Tiktok account, if they have linked one. It cannot be linked to another user. */
    tiktok?: Tiktok;
    /** The user's LinkedIn account, if they have linked one. It cannot be linked to another user. */
    linkedin?: LinkedIn;
    /** The user's Apple account, if they have linked one. It cannot be linked to another user. */
    apple?: Apple;
    /** The user's Farcaster account, if they have linked one. It cannot be linked to another user. */
    farcaster?: Farcaster;
    /** The user's Telegram account, if they have linked one. It cannot be linked to another user. */
    telegram?: Telegram;
    /** The list of accounts associated with this user. Each account contains additional metadata
     * that may be helpful for advanced use cases. */
    linkedAccounts: Array<LinkedAccountWithMetadata>;
    /** The list of MFA Methods associated with this user. */
    mfaMethods: Array<MfaMethod>;
    /**
     * Whether or not the user has explicitly accepted the Terms and Conditions
     * and/or Privacy Policy
     */
    hasAcceptedTerms: boolean;
    /** Whether or not the user is a guest */
    isGuest: boolean;
    /** Custom metadata field for a given user account */
    customMetadata?: CustomMetadataType;
}
```

{% endtab %}
{% endtabs %}

### Return values

#### `account: Wallet`

The primary account being used. This will be either:

* The smart account (if connected via Privy)
* The wallet address (if connected via DappKit)

#### `smartAccount: SmartAccount`

Information about the user's smart account:

* `address`: The smart account address
* `domain`: Associated VeChain domain name
* `image`: Generated avatar image
* `isDeployed`: Whether the smart account is deployed; smart accounts can be deployed on demand to avoid spending money on non active users. Learn more about smart accounts [here](#smartaccount-smartaccount).
* `isActive`: Whether this is the currently active account
* `version`: Smart account contract version

When the user is connected with Privy `account` will always be equal to the `smartAccount`.

#### `connectedWallet: Wallet`

The currently connected wallet, regardless of connection method (can be both a Privy Embedded Wallet or a self custody Wallet connected trough VeWorld or Sync2):

* `address`: Wallet address
* `domain`: Associated VeChain domain name
* `image`: Generated avatar image

#### `privyUser: User | null`

The Privy user object if connected via Privy, null otherwise

#### `connection: ConnectionState`

Current connection state information:

* `isConnected`: Overall connection status
* `isLoading`: Whether connection is in progress
* `isConnectedWithSocialLogin`: Connected via Privy (no crossapp)
* `isConnectedWithDappKit`: Connected via DappKit
* `isConnectedWithCrossApp`: Connected via cross-app
* `isConnectedWithPrivy`: Connected via Privy (social or cross-app)
* `isConnectedWithVeChain`: Connected with VeChain cross-app
* `source`: Connection source information
* `isInAppBrowser`: Whether your app is running in VeWorld app browser
* `nodeUrl`: Current node URL (if provided by you in the provider, otherwise default in use by VeChain Kit)
* `delegatorUrl`: Fee delegation service URL setted by you in the provider
* `chainId`: Current chain ID
* `network`: Network type (mainnet/testnet/custom)

#### `disconnect(): Promise<void>`

This function terminates the current wallet connection, ensuring cleanup of connection details and triggering necessary event listeners for state updates.

### Connection Sources

The hook supports three main connection types:

1. **Social Login** (`privy`): Authentication via social providers with your own APP\_ID
2. **Wallet Connection** (`wallet`): Direct wallet connection via DappKit
3. **Cross-App** (`privy-cross-app`): Connection through ecosystem integration

### Events

The hook dispatches a `wallet_disconnected` event when the wallet is disconnected, which can be used to trigger UI updates in dependent components.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.vechainkit.vechain.org/hooks/wallet.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
