submitTransaction static method

Future<DiditTransactionResult> submitTransaction(
  1. String transactionToken,
  2. DiditTransactionPayload transaction, {
  3. DiditTransactionOptions options = const DiditTransactionOptions(),
})

Submit a transaction directly from the device.

Requires a transaction SDK token minted by your backend via POST /v3/transactions/sdk-token/. Device intelligence is attached automatically. If the response requires a wallet-ownership widget and DiditTransactionOptions.autoLaunchAction is not disabled, the SDK launches it natively and later invokes DiditTransactionOptions.onTransactionUpdated with the refreshed transaction. A verification_session action is never auto-launched — it is returned on DiditTransactionResult.actionRequired for the host app to launch with its own Didit verification integration.

Throws a DiditTransactionException with DiditTransactionException.code set to invalid_token, expired_token, validation (see DiditTransactionException.fieldErrors), or network.

Example:

final result = await DiditSdk.submitTransaction(
  sdkToken,
  DiditTransactionPayload(
    txnId: 'order-123',
    type: 'crypto',
    info: DiditTransactionInfo(
      direction: 'outbound',
      amount: 0.25,
      currency: 'ETH',
    ),
    travelRule: DiditTravelRule(required: true),
  ),
  options: DiditTransactionOptions(
    onTransactionUpdated: (updated) => print(updated.status),
  ),
);
print('${result.transactionId} ${result.actionRequired?.type}');

Implementation

static Future<DiditTransactionResult> submitTransaction(
  String transactionToken,
  DiditTransactionPayload transaction, {
  DiditTransactionOptions options = const DiditTransactionOptions(),
}) async {
  final callId =
      'txn-${DateTime.now().millisecondsSinceEpoch}-${++_transactionCallCounter}';
  final onTransactionUpdated = options.onTransactionUpdated;
  if (options.autoLaunchAction && onTransactionUpdated != null) {
    _ensureTransactionUpdateHandler();
    _pendingTransactionUpdates[callId] = onTransactionUpdated;
  }
  try {
    final raw = await SdkFlutterPlatform.instance.submitTransaction(
      transactionToken,
      transaction.toMap(),
      {
        'callId': callId,
        'autoLaunchAction': options.autoLaunchAction,
        if (options.baseUrl != null) 'baseUrl': options.baseUrl,
      },
    );
    final result = DiditTransactionResult.fromMap(raw);
    if (result.actionRequired == null) {
      _pendingTransactionUpdates.remove(callId);
    }
    return result;
  } on PlatformException catch (e) {
    _pendingTransactionUpdates.remove(callId);
    throw DiditTransactionException.fromPlatformException(e);
  }
}