The upgrade guide for this release containing only implementation related changes can be found here.

This release is not a literal major one as far as versioning is concerned, but it’s packed with helpful updates!

Phantom Mobile Redirect UX

Ever wished you could connect directly to Phantom from your mobile browser, instead of opening in the in-app browser? Now you can with a new prop mobileExperience. Just set it to redirect and enjoy the new Phantom deeplinking UX on mobile.

ERC 1155 support

Our NFT Gating feature helps you gate by NFT ownership. We’ve now added support for ERC 1155 tokens, so you can now gate by NFT ownership for both ERC 721 and ERC 1155 token types!

New webhooks

We’ve added a bunch of new webhook events to help you keep track of what’s going on in your app. You can find the full list of webhooks here. Here’s what’s new:

  • user.passkeyRecovery.started
  • user.passkeyRecovery.completed
  • wallet.transferred
  • visit.created

userId in all webhook payloads

You wanted an easier way to always have the userId of the user that triggered the event - now we also include the userId of the trigger in all webhook event objects!

Extra wallet support

  • Argent Web and Mobile now supported
  • StarkNet support for Sepolia added
  • Enabled Ledger for Glow, Solflare, and Backpack
  • Enabled hardware wallet for Solana wallets
  • Magic integration now supports Flow wallets

Wallet account export

Wallet account private key export is now available for Embedded HD walllets. This is a great way to allow your users to export their wallet account’s private key for use elsewhere. Now users can select between exporting either their entire wallet’s seed phrase, or a single wallet’s private key.

One-Time Codes & Session keys for Embedded Wallets

You can now configure embedded wallets to sign for transactions using one-time email verification codes. You can also define a session length that allows users to transact without a secondary prompt for the defined time period.

More information abou this feature here.

Solana support for Embedded Wallets

Dynamic now offers embedded wallets on EVM compatible networks and Solana. If you enable both, they will both be created at once and whichever you have marked as “primary” will be shown as the primary address in their profile upon sign in.

Solana embedded wallets support signing off-chain messages, sending on-chain transactions and more.

More information about that feature here.

Extra text in the signup/login UI

Programmable Views allow you much more control over what signup/login methods you display at any time. Additionally, you can now create views section for extra text in the signup/login UI:

views: [
    type: 'login',
    sections: [
      { type: 'text', label: 'Intro Text', alignment: 'center' },

Hooks, methods & widgets

  • showDynamicUserProfile Currently the setShowDynamicUserProfile method exists on useDynamicContext which helps you trigger the user profile modal, however you had no way of knowing if the modal was open or not. Now you can use the showDynamicUserProfile boolean to get this information.
export const Example = () => {
  const { showDynamicUserProfile } = useDynamicContext();
  React.useEffect(() => {
    if (showDynamicUserProfile) {
      /* On widget opens */
    } else {
      /* On widget closes */
  }, [showDynamicUserProfile]);
  return null;
  • useConnectWithEmailOtp Now you can handle headless email signup with the useConnectWithEmailOtp hook! It exposes connectWithEmail and verifyOneTimePassword functions. It supports both Dynamic native login and our Magic integration.

  • setShowLinkNewWalletModal This new method comes as part of useDynamicContext and allows you to trigger the link new wallet method programmatically.

const LinkNewWalletButton = () => {
  const { setShowLinkNewWalletModal } = useDynamicContext();
  return (
    <button onClick={() => setShowLinkNewWalletModal(true)}>
      Link a new wallet
  • setAuthMode Previously, you could set the auth mode via the initialAuthenticationMode prop on DynamicContextProvider but this would be set in stone once the app loads. Now you can also set it programmatically via the setAuthMode method on useDynamicContext.
const Example = () => {
  const { setAuthMode } = useDynamicContext();
  return (
    <button onClick={() => setAuthMode("connect-only")}>Connect Only</button>

This allows you to use the multi wallet prompts without needing the full user profile which in which these prompts are normally bundled.

New callbacks

  • onAuthFlowCancel This callback is triggered when the user cancels the auth flow before successful completion. It will get called alongside onAuthFlowClose.