Skip to main content
The Flutter SDK can spin up an Alchemy smart account for any EVM wallet your user holds. The Para wallet signs; the smart account is what shows up on-chain. You get gas sponsorship through Alchemy’s Gas Manager and atomic batched calls through the Account Kit.
Only Alchemy (EIP-4337) is wired through the native bridge today. ZeroDev, Pimlico, and the other providers already available on web and React Native are on the roadmap for Flutter.

Setup

  1. Create an Alchemy account, grab your API key, and create a Gas Manager policy for the chain you’re targeting. The policy ID is what tells the paymaster to sponsor gas.
  2. Drop the values into your .env file. flutter_dotenv is already wired into the Flutter example:
.env
You don’t need to add a pub.dev dependency. The Flutter SDK reaches @getpara/aa-alchemy through the bridge on the web side.

Usage

Create the smart account, then send a gasless transaction with it:
Heads up on timing: UserOp inclusion on a public chain usually lands in 30 to 90 seconds, and the call blocks until it does. ParaConfig.requestTimeout defaults to 120s for this reason. Override it when you build your ParaConfig if you’d rather bail earlier.

Batched transactions

One UserOp, multiple calls, one receipt. Use it for approve + swap, approve + transfer, or anything that should succeed or fail together:

Error handling

Provider failures come back with a SmartAccountErrorCode from @getpara/core-sdk. The ones you’re most likely to see:
  • PROVIDER_RATE_LIMITED: back off and retry.
  • SPONSORSHIP_DENIED: the gas policy rejected this UserOp. Check the Alchemy dashboard.
  • TRANSACTION_REVERTED: the target contract reverted at execution time.
  • MISSING_ACCOUNT_ADDRESS: you called sendSmartAccountTransaction before createSmartAccount for this chain + address.
Errors surface as ParaBridgeException and keep the provider’s original message.

What gets returned

createSmartAccount returns a SmartAccountInfo:
sendSmartAccountTransaction and sendSmartAccountBatchTransaction return an AATransactionReceipt:
BigInt fields arrive as decimal strings so you don’t lose uint256 precision across the bridge.

Reference

Full working implementation: examples-hub/mobile/with-flutter/lib/features/smart_account/smart_account_screen.dart.