NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #4446 most downloaded on pub.dev
Privy Flutter SDK enables seamless authentication, wallet management, and identity verification for Flutter apps with native iOS and Android support.
Last release 15 days ago
22 Sep 2026
Release timing varies
gaps range from 2 weeks to 4 months
Nearly every release is documented
notes for 21 of 21 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
22 releases · first in 2025
Added privy.onNetworkRestored() to retry session restoration after connectivity returns.
privy.onNetworkRestored() to retry session restoration after connectivity returns.Bumped the iOS SDK to 2.16.2 and the Android SDK to 0.15.0.
Wallet Migration: Added Future > user.migrateWalletsIfNeeded() for manually triggering TEE wallet migration when disableAutomaticMigration is enabled
One column per month.
Future<Result<void>> user.migrateWalletsIfNeeded() for manually triggering TEE wallet migration when disableAutomaticMigration is enabled in PrivyConfig.User Refresh: PrivyUser.refresh() now calls the native SDK's refresh() method instead of getUser(), ensuring server-side changes are fetched.
PrivyUser.refresh() now calls the native SDK's refresh() method instead of getUser(), ensuring server-side changes are fetched.Logout: privy.logout() now succeeds silently when the user is already logged out on the native side, instead of erroring.
privy.logout() now succeeds silently when the user is already logged out on the native side, instead of erroring.privy.oAuth):
Future<Result<PrivyUser>> privy.oAuth.link({required OAuthProvider provider, required String appUrlScheme}) for linking an OAuth provider to the currently authenticated userFuture<Result<PrivyUser>> privy.oAuth.unlink({required OAuthProvider provider, required String subject}) for unlinking an OAuth provider from the currently authenticated useruser.mfa.sms):
Future<Result<void>> user.mfa.sms.enroll.sendCode(String phoneNumber) for sending an SMS enrollment verification codeFuture<Result<PrivyUser>> user.mfa.sms.enroll.submit({required String code, required String phoneNumber}) for completing SMS MFA enrollmentFuture<Result<void>> user.mfa.sms.verify.sendCode() for sending an SMS verification code during an MFA challengeFuture<Result<void>> user.mfa.sms.verify.submit(String code) for submitting an SMS OTP during an MFA challengeFuture<Result<PrivyUser>> user.mfa.sms.unenroll() for removing SMS as an MFA methoduser.mfa.totp):
Future<Result<TotpSecret>> user.mfa.totp.enroll.generateSecret() for generating a TOTP secret during enrollmentFuture<Result<PrivyUser>> user.mfa.totp.enroll.submit(String code) for completing TOTP MFA enrollmentFuture<Result<void>> user.mfa.totp.verify.submit(String code) for submitting a TOTP code during an MFA challengeFuture<Result<PrivyUser>> user.mfa.totp.unenroll() for removing TOTP as an MFA methodTotpSecret model with secret and authUrl fieldsuser.mfa.passkeys):
Future<Result<PrivyUser>> user.mfa.passkeys.enroll.submit(List<String> credentialIds) for enrolling passkey MFAFuture<Result<void>> user.mfa.passkeys.verify.submit(String relyingParty) for verifying passkey MFA using biometric authenticationFuture<Result<PrivyUser>> user.mfa.passkeys.unenroll({bool removeForLogin = true}) for unenrolling passkey MFA with option to keep or remove the passkey as a login methodprivy.mfa):
Future<Result<void>> privy.mfa.setConfig(MfaConfig config) for configuring MFA listener and timeout after SDK initializationFuture<Result<void>> privy.mfa.resumeBlockedActions([Exception? mfaError]) for resuming or cancelling suspended MFA-protected operationsMfaConfig with MfaListener listener and Duration timeout (default 5 minutes) for configuring MFA behaviorMfaListener interface with onMfaRequired(PrivyUser user) callback for handling MFA verification requirementsMfaMethod sealed class with MfaMethodSms, MfaMethodTotp, and MfaMethodPasskey subtypesMfaException sealed class with typed subtypes: MfaMissingOrInvalidException, MfaChallengeExpiredException, MfaMaxAttemptsReachedException, and MfaSdkTimeoutExceptionAdded generateAuthorizationSignatureFromBytes(Uint8List payload) to PrivyUser for generating cryptographic signatures over pre-serialized binary paylo
generateAuthorizationSignatureFromBytes(Uint8List payload) to PrivyUser for generating cryptographic signatures over pre-serialized binary payloads using the user's signer keyOauthProvider.telegram to suopport Telegram authentication support via OAuth flowAdded generateAuthorizationSignature(WalletApiPayload payload) to PrivyUser for generating cryptographic signatures over wallet API requests using the
generateAuthorizationSignature(WalletApiPayload payload) to PrivyUser for generating cryptographic signatures over wallet API requests using the user's signer keyaddSigners(List<SignerInput> signers) to EmbeddedWallet for adding key quorum signers to TEE-based embedded walletsaddSigner(SignerInput signer) convenience method for adding a single signerSignerInput model with signerId and optional policyIds fieldsremoveSigner(String signerId) to EmbeddedWallet for removing a specific signer by key quorum IDremoveAllSigners() to EmbeddedWallet for removing all additional signers from a walletAdded Future > privy.email.unlink(email) for unlinking email addresses from user accounts
Future<Result<PrivyUser>> privy.email.unlink(email) for unlinking email addresses from user accountsFuture<Result<PrivyUser>> privy.sms.unlink(phoneNumber) for unlinking phone numbers from user accountsResult<PrivyUser> instead of Result<void>, providing immediate access to the updated user object after unlinkingprivy.siwe.unlink(address) now returns Result<PrivyUser>privy.siws.unlink(address) now returns Result<PrivyUser>privy.passkey.unlink(credentialId) now returns Result<PrivyUser>Result<PrivyUser> instead of Result<void>, providing immediate access to the updated user object after linkingprivy.email.linkWithCode() now returns Result<PrivyUser>privy.sms.linkWithCode() now returns Result<PrivyUser>privy.siwe.link() now returns Result<PrivyUser>privy.siws.link() now returns Result<PrivyUser>privy.passkey.link() now returns Result<PrivyUser>Minimum iOS version bumped to 17.0 to support latest PrivySDK
privy.passkey.signup(relyingParty, displayName) for passkey registration with WebAuthnprivy.passkey.login(relyingParty) for passkey authenticationprivy.passkey.link(relyingParty, displayName) for linking passkeys to existing authenticated usersprivy.passkey.unlink(credentialId) for unlinking passkeys from user accountsprivy.siws.generateMessage(params) method to create SIWS messages for Solana wallet signingprivy.siws.login(message, signature, params, metadata) method for authenticating users with SIWS signaturesprivy.siws.link(message, signature, params, metadata) method for linking Solana wallets to authenticated usersprivy.siws.unlink(address) method for unlinking Solana wallets from user accountsembeddedSolanaWallet.signTransaction(transaction) for Solana transaction signingembeddedSolanaWallet.signAndSendTransaction(transaction) for signing and broadcasting Solana transactionsprivy.siwe.generateSiweMessage() → Use privy.siwe.generateMessage() insteadprivy.siwe.loginWithSiwe() → Use privy.siwe.login() insteadprivy.siwe.linkWithSiwe() → Use privy.siwe.link() insteadprivy.siwe.unlinkWallet() → Use privy.siwe.unlink() insteadAdded updateWithCode method to update user email addresses with OTP verification
updateWithCode method to update user email addresses with OTP verificationlinkWithCode method to link phone numbers to existing user accountsupdateWithCode method to update user phone numbers with OTP verificationEthereumRpcRequest.personalSign(String message, String address) for personal message signingEthereumRpcRequest.secp256k1Sign(String hash) for secp256k1 signature generationEthereumRpcRequest.ethSign(String address, String message) for Ethereum message signingEthereumRpcRequest.ethSignTypedDataV4(String address, String typedDataJson) for EIP-712 typed data signingEthereumRpcRequest.ethSignTransaction(String transactionJson) for transaction signingEthereumRpcRequest.ethSendTransaction(String transactionJson) for direct transaction sendingAdded Sign-In with Ethereum (SIWE) support for iOS and Android
generateSiweMessage method to create SIWE messages for wallet signingloginWithSiwe method for authenticating users with SIWE signatureseth_sendRawTransaction RPC method is deprecated and has been removed in this version.
secp256k1_sign RPC method in Ethereum wallet providerFuture<PrivyUser?> getUser() - awaits ready under the hood, then returns user if authenticatedeth_sendRawTransaction RPC method is deprecated and has been removed in this version.eth_sendTransaction instead for sending transactionsPrivy.user - Devs should use Future<PrivyUser?> getUser() instead.Added Google OAuth login support for iOS and Android
getAuthState method to retrieve the current authentication statesuspend fun awaitReady() - Devs should use suspend fun getAuthState(): AuthState instead.Privy.isReadyloginWithCode methodAdditional AuthState type: AuthenticatedUnverified added
AuthenticatedUnverified addedcreateAdditional parameter to create multiple Solana walletsExposed EmbeddedSolanaWallet object as publicly accessible.
EmbeddedSolanaWallet object as publicly accessible.Added refresh function to PrivyUser that allows developers to directly refresh user data.
refresh function to PrivyUser that allows developers to directly refresh user data.2.0.0-beta.5.Updated iOS SDK version to 2.0.0-beta.5.
2.0.0-beta.5.Updated iOS SDK version to 2.0.0-beta.4.
2.0.0-beta.4.Added CocoaPods support for easier iOS integration.
2.0.0-beta.3.Fixed issue in awaitReady to ensure authState properly updates on initialization.
awaitReady to ensure authState properly updates on initialization.Implemented getAccessToken method to retrieve the user's authentication token.
getAccessToken method to retrieve the user's authentication token.getAccessToken call in native iOS & Android SDKs.Wallet creation (Ethereum & Solana)
Authentication:
Embedded Wallets:
Platform Support:
Your coding agent can read these notes before it upgrades. Set up the MCP server →