simulateTransaction method

  1. @override
Future<TransactionResponse> simulateTransaction(
  1. Transaction transactionBlock, {
  2. TransactionIncludeOptions? include,
  3. bool? doGasSelection,
  4. bool? checksEnabled,
})
override

Simulates transactionBlock without signing; results surface via effects, events, and command outputs.

Implementation

@override
Future<TransactionResponse> simulateTransaction(
  Transaction transactionBlock, {
  TransactionIncludeOptions? include,
  bool? doGasSelection,
  bool? checksEnabled,
}) async {
  final txJson =
      transactionBlock.toGrpcTransaction().toProto3Json()
          as Map<String, dynamic>;
  final payment = transactionBlock.getData().gasData.payment;
  final data = await _client.executeData(
    _simulateTransactionOperation,
    generated.Variables$Query$SimulateTransaction(
      tx: txJson,
      checksEnabled: checksEnabled,
      doGasSelection: doGasSelection ?? (payment != null && payment.isEmpty),
    ),
  );
  final result = data.simulateTransaction;
  final effects = result.effects;
  final gasObjectId = effects?.gasEffects?.gasObject?.address;
  final transactionBcs = effects?.transaction?.transactionBcs;
  final executionError = effects?.executionError;
  return TransactionResponse(
    digest: '',
    epoch: effects?.epoch?.epochId.toString(),
    status: ExecutionStatus(
      success: effects?.status == schema.Enum$ExecutionStatus.SUCCESS,
      error: executionError == null
          ? null
          : _parseExecutionError(
              message: executionError.message,
              abortCode: executionError.abortCode,
              sourceLineNumber: executionError.sourceLineNumber,
              instructionOffset: executionError.instructionOffset,
              identifier: executionError.identifier,
              constant: executionError.constant,
              package: executionError.module?.package?.address,
              module: executionError.module?.name,
              functionName: executionError.function?.name,
            ),
    ),
    bcs: include?.bcs == true && transactionBcs != null
        ? base64Decode(transactionBcs)
        : null,
    events: effects?.events?.nodes.map(_mapSimEvent).toList(),
    commandResults: result.outputs?.map(_mapSimCommand).toList(),
    gasPaymentMocked:
        gasObjectId != null &&
        normalizeSuiAddress(gasObjectId) == MOCKED_GAS_OBJECT_ID,
  );
}