Skip to main content
In your application, when a user is logged in, you’ll want to request delegation for your application.
Make sure you have configured delegated access in the dashboard before triggering delegation.

Dynamic’s UI

Auto-prompt User on Sign In

If you chose to prompt the user on sign in during the configuration step, 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:
// 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:
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:
// 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:
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

// 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

// 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()

What's next?

Learn how to properly receive the delegation materials on your server