> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dynamic.xyz/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Triggering Delegation

> How to trigger delegation for a user in Kotlin.

In your application, when a user is logged in, you'll want to request delegation for your application.

<Info>
  Make sure you have [configured delegated access](/overview/wallets/embedded-wallets/mpc/delegated-access/configuration) in the dashboard before triggering delegation.
</Info>

## Dynamic's UI

### Auto-prompt User on Sign In

If you chose to prompt the user on sign in during the [configuration step](/overview/wallets/embedded-wallets/mpc/delegated-access/configuration), the user is prompted to approve delegation for your application when they next sign in.

### Trigger Delegation Manually

You can use the `initDelegationProcess` method from the wallets module to open the delegation modal UI:

```kotlin theme={"system"}
// Open the delegation modal for all eligible wallets
DynamicSDK.instance.wallets.initDelegationProcess()

// Or specify which wallets to delegate
DynamicSDK.instance.wallets.initDelegationProcess(
    walletIds = listOf("wallet-id-1", "wallet-id-2")
)
```

### Check If User Should Be Prompted

Before prompting, you can check whether the user should see a delegation prompt:

```kotlin theme={"system"}
val shouldPrompt = DynamicSDK.instance.wallets.shouldPromptWalletDelegation()

if (shouldPrompt) {
    DynamicSDK.instance.wallets.initDelegationProcess()
}
```

## Your Own UI

You can use `delegateKeyShares` to delegate wallets programmatically without showing any Dynamic UI:

```kotlin theme={"system"}
// Delegate all eligible wallets
DynamicSDK.instance.wallets.delegateKeyShares()

// Or delegate specific wallets
DynamicSDK.instance.wallets.delegateKeyShares(
    wallets = listOf(
        DelegationWalletIdentifier(
            chainName = ChainEnum.EVM,
            accountAddress = "0x123..."
        ),
        DelegationWalletIdentifier(
            chainName = ChainEnum.SOL,
            accountAddress = "ABC123..."
        )
    )
)
```

## Monitor Delegation State

You can observe delegation state changes using Kotlin's `StateFlow`:

```kotlin theme={"system"}
import kotlinx.coroutines.flow.collect

// Get current state synchronously
val state = DynamicSDK.instance.wallets.delegatedAccessState
println("Enabled: ${state.delegatedAccessEnabled}")
println("Required: ${state.requiresDelegation}")

// Listen to state changes (in a coroutine scope)
DynamicSDK.instance.wallets.delegatedAccessChanges.collect { state ->
    state.walletsDelegatedStatus.forEach { wallet ->
        println("${wallet.address}: ${wallet.status}")
    }
}
```

## Check Wallet Delegation Status

```kotlin theme={"system"}
// Get status of all wallets
val statuses = DynamicSDK.instance.wallets.getWalletsDelegatedStatus()

statuses.forEach { status ->
    println("Wallet ${status.address} on ${status.chain}: ${status.status}")
}

// Get status for a specific wallet
val status = DynamicSDK.instance.wallets.getDelegationStatusForWallet("wallet-id")
status?.let {
    println("Status: ${it.status}") // DELEGATED, PENDING, or DENIED
}
```

## Dismiss or Deny Delegation

```kotlin theme={"system"}
// Dismiss the prompt for the current session only (resets on logout/restart)
DynamicSDK.instance.wallets.dismissDelegationPrompt()

// Or dismiss for a specific wallet
DynamicSDK.instance.wallets.dismissDelegationPrompt(walletId = "wallet-id")

// Permanently deny delegation for a wallet (user won't be prompted again)
DynamicSDK.instance.wallets.denyWalletDelegation(walletId = "wallet-id")

// Clear all session dismissals
DynamicSDK.instance.wallets.clearDelegationSessionState()
```

<Card title="What's next?" icon="link" color="#4779FE" href="/kotlin/wallets/embedded-wallets/mpc/delegated-access/receiving-delegation">
  Learn how to properly receive the delegation materials on your server
</Card>
