Skip to main content
Privy now allows you to natively use smart wallet for a better developer experience. Check out the docs here.
Once you’ve used Privy’s embedded wallet as a signer to create smart accounts, you can also store the user’s smart account address on their user object. At a high-level, this is accomplished by requesting a Sign-In With Ethereum (SIWE) signature from the user’s smart account, and passing the resulting signature to Privy to verify that the smart account is associated with the authenticated user. Read below to learn more!
Storing a user’s smart account address on the user object makes the address available in their user state in your client and the user object you might query from your server. This enables you to easily associate smart account addresses with users.

1. Generate a SIWE message for the smart account

To start, import the useLinkWithSiwe hook from @privy-io/react-auth. This hook allows you to generate a SIWE message for an arbitrary wallet and pass the resulting signature for verification.
Then, call the generateSiweMessage method returned by the hook to generate a SIWE message for the smart account to sign. As parameters to this method, pass an object with the following fields:
Make sure the chainId you pass to generateSiweMessage and linkWithSiwe is CAIP-2 formatted.
As an example, you might generate a SIWE message for the smart account like so:

2. Request a personal_sign signature from the smart account

Next, with the message you generated in step (1), request a EIP191 personal_sign signature from the smart account. The interface for requesting this signature may depend on which smart account provider (ZeroDev, Pimlico, Safe, Biconomy, Alchemy your app uses; see the corresponding guides to understand the best way to request a signature from the wallet.

3. Pass the signature to Privy

Lastly, pass the signature from the smart account to Privy using the linkWithSiwe method returned by the useLinkWithSiwe hook. As parameters to this method, include an object with the following fields: As an example, you can pass the smart account’s signature to Privy for verification like so:

4. Get the smart account address

Once you’ve successfully linked the smart account to the user, you can easily get their smart account address from their Privy user object. Simply inspect the linkedAccounts array for the entry with:
  • type: 'wallet'
  • walletClientType: 'privy_smart_account', or any other custom walletClientType you chose
As an example, you can get the smart account address like so!
That’s it! You can also find the user’s smart account when querying Privy’s API from your server, and applying the same logic to parsing the linked_accounts array.