Privy provides a UI component that you can use to prompt users to provision server sessions for their wallets and revoke server-side access.

Provision server-side access

To prompt users to delegate their wallets with a consent screen, use the delegateWallet method from the useDelegatedActions hook:

import {useDelegatedActions} from '@privy-io/react-auth';
...
const {delegateWallet} = useDelegatedActions();

Parameters

address
string
required

Address of the embedded wallet to delegate.

chainType
'ethereum' | 'solana'
required

Chain type of the embedded wallet to delegate.

When invoked, the delegateWallet method will open a Privy modal where the user can either approve or reject the delegation.

If the user approves, Privy will initiate the process to provision a server session for the wallet. If the user refuses or there is another error during provisioning, this method will throw an error.

Usage

import {
usePrivy,
useSolanaWallets,
useDelegatedActions,
type WalletWithMetadata,
} from '@privy-io/react-auth';

function DelegateActionButton() {
const {user} = usePrivy();
const {ready, wallets} = useSolanaWallets(); // or useWallets()
const {delegateWallet} = useDelegatedActions();

// Find the embedded wallet to delegate from the array of the user's wallets
const walletToDelegate = wallets.find((wallet) => wallet.walletClientType === 'privy');

// Check if the wallet to delegate by inspecting the user's linked accounts
const isAlreadyDelegated = !!user.linkedAccounts.find(
    (account): account is WalletWithMetadata => account.type === 'wallet' && account.delegated,
);

const onDelegate = async () => {
    if (!walletToDelegate || !ready) return; // Button is disabled to prevent this case
    await delegateWallet({address: walletToDelegate.address, chainType: 'solana'}); // or chainType: 'ethereum'
};

return (
    <button disabled={!ready || !walletToDelegate || isAlreadyDelegated} onClick={onDelegate}>
    Delegate access
    </button>
);
}

Revoke server-side access

To prompt users to revoke a server session with a revocation screen, use the revokeWallets method from the useDelegatedActions hook:

import {useDelegatedActions} from '@privy-io/react-auth';
...
const {revokeWallets} = useDelegatedActions();

When invoked, the revokeWallets method will open a Privy modal where the user can either confirm the revocation of their server session. If the user has no server sessions, this method will error.

Once a user confirms revocation, your app will no longer be able to take actions on behalf of the user with their wallet unless the user provisions a server session.

If a user has provisioned multiple server sessions, they will all be revoked.

Usage

import {usePrivy, useDelegatedActions, type WalletWithMetadata} from '@privy-io/react-auth';

function RevokeDelegateActionButton() {
  const {user} = usePrivy();
  const {revokeWallets} = useDelegatedActions();

  // Check if the user has any delegated wallets by searching the linkedAccounts array for wallets
  // with `delegated: true` set
  const hasDelegatedWallets =
    user.linkedAccounts.filter(
      (account): account is WalletWithMetadata => account.type === 'wallet' && account.delegated
    ).length !== 0;

  const onRevoke = async () => {
    if (!hasDelegatedWallets) return; // Button is disabled to prevent this case
    await revokeWallets();
  };

  return (
    <button disabled={!hasDelegatedWallets} onClick={onRevoke}>
      Revoke permission for this app to transact on my behalf
    </button>
  );
}

Was this page helpful?