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(
  sui_dart.Transaction transactionBlock, {
  TransactionIncludeOptions? include,
  bool? doGasSelection,
  bool? checksEnabled,
}) async {
  final readMask = _simulateReadMask(include);

  // gRPC conversion is synchronous, so intents must resolve before it.
  if (!transactionBlock.isPreparedForSerialization()) {
    await transactionBlock.prepareForSerialization(
      sui_dart.SerializeTransactionOptions(client: this),
    );
  }

  // An empty payment means address-balance gas, so the node must select gas.
  final payment = transactionBlock.getData().gasData.payment;
  final gasSelection = doGasSelection ?? (payment != null && payment.isEmpty);

  final response = await _client.transactionExecutionService
      .simulateTransaction(
        SimulateTransactionRequest(
          transaction: transactionBlock.toGrpcTransaction(),
          readMask: readMask,
          doGasSelection: gasSelection,
          checks: checksEnabled == false
              ? SimulateTransactionRequest_TransactionChecks.DISABLED
              : SimulateTransactionRequest_TransactionChecks.ENABLED,
        ),
      );

  var result = _parseTransaction(response.transaction, include);

  if (include?.commandResults == true) {
    result = result.copyWith(
      commandResults: response.commandOutputs.map((cmdResult) {
        return CommandResult(
          returnValues: cmdResult.returnValues.map((output) {
            return CommandOutput(
              bcs: output.hasValue()
                  ? Uint8List.fromList(output.value.value)
                  : Uint8List(0),
            );
          }).toList(),
          mutatedReferences: cmdResult.mutatedByRef.map((output) {
            return CommandOutput(
              bcs: output.hasValue()
                  ? Uint8List.fromList(output.value.value)
                  : Uint8List(0),
            );
          }).toList(),
        );
      }).toList(),
    );
  }

  return result;
}