Skip to main content
Use WalletType.stellar to create or load a Stellar wallet, then pass a StellarTransaction payload to signTransaction.

Quick start

stellar_signing.dart
import 'package:para/para.dart';

final para = Para(apiKey: 'your-api-key');

Future<Wallet> getOrCreateStellarWallet(Para para) async {
  final wallets = await para.fetchWallets();
  for (final wallet in wallets) {
    if (wallet.type == WalletType.stellar && wallet.id != null) {
      return wallet;
    }
  }

  return para.createWallet(
    type: WalletType.stellar,
    skipDistribute: false,
  );
}

final wallet = await getOrCreateStellarWallet(para);

final transaction = StellarTransaction.payment(
  to: 'GRECIPIENT_STELLAR_ADDRESS',
  amount: '10',
  networkPassphrase: StellarNetwork.testnetPassphrase,
  memo: const StellarMemo.text('hello'),
);

final result = await para.signTransaction(
  walletId: wallet.id!,
  transaction: transaction.toJson(),
);

if (result is SuccessfulSignatureResult) {
  print('Signed transaction: ${result.signedTransaction}');
}

Display the address

A Stellar wallet uses the same Wallet model as the other wallet types. Use wallet.address when it is present. If you only have the raw Ed25519 public key, derive the Stellar G-address with getStellarAddress.
stellar_address.dart
import 'package:para/para.dart';

final address = wallet.address ??
    (wallet.publicKey == null ? null : getStellarAddress(wallet.publicKey!));

print('Stellar address: $address');
You can also derive a Stellar address from a Solana-format Ed25519 public key:
stellar_address_from_solana.dart
final stellarAddress = getStellarAddressFromSolana(solanaAddress);

Sign a payment

StellarTransaction.payment supports native XLM payments and issued assets. The networkPassphrase must match the network the transaction will be submitted to.
stellar_payment.dart
final xlmPayment = StellarTransaction.payment(
  to: 'GRECIPIENT_STELLAR_ADDRESS',
  amount: '10',
  networkPassphrase: StellarNetwork.testnetPassphrase,
  fee: '100',
  timeout: 60,
);

final signed = await para.signTransaction(
  walletId: wallet.id!,
  transaction: xlmPayment.toJson(),
);

if (signed is SuccessfulSignatureResult) {
  print('Signed transaction: ${signed.signedTransaction}');
}
For issued assets, include the asset code and issuer:
stellar_asset_payment.dart
final usdcPayment = StellarTransaction.payment(
  to: 'GRECIPIENT_STELLAR_ADDRESS',
  amount: '5',
  asset: const StellarAsset(
    code: 'USDC',
    issuer: 'GISSUER_STELLAR_ADDRESS',
  ),
  networkPassphrase: StellarNetwork.publicPassphrase,
);

Sign serialized XDR

If your backend or Stellar SDK code already builds the transaction, pass the serialized XDR directly.
stellar_xdr.dart
final transaction = StellarTransaction.serializedXdr(
  'AAAAAgAAA...',
  networkPassphrase: StellarNetwork.publicPassphrase,
);

final result = await para.signTransaction(
  walletId: wallet.id!,
  transaction: transaction.toJson(),
);

if (result is SuccessfulSignatureResult) {
  print('Signed transaction: ${result.signedTransaction}');
}

Network passphrases

NetworkConstant
Stellar TestnetStellarNetwork.testnetPassphrase
Stellar Public NetworkStellarNetwork.publicPassphrase