signAndSubmitTransaction method

Future<SubmitUriSchemeTransactionResponse> signAndSubmitTransaction(
  1. String url,
  2. KeyPair signerKeyPair,
  3. {Network? network}
)

Signs the given transaction and submits it to the callback url if available, otherwise it submits it to the stellar network.

Implementation

Future<SubmitUriSchemeTransactionResponse> signAndSubmitTransaction(
    String url, KeyPair signerKeyPair,
    {Network? network}) async {
  Network net = Network.PUBLIC;
  if (network != null) {
    net = network;
  }

  final XdrTransactionEnvelope envelope = _getXdrTransactionEnvelope(url);

  AbstractTransaction absTransaction =
      AbstractTransaction.fromEnvelopeXdr(envelope);
  absTransaction.sign(signerKeyPair, net);

  final String? callback = getParameterValue(callbackParameterName, url);
  if (callback != null && callback.startsWith("url:")) {
    final Uri serverURI = Uri.parse(callback.substring(4));
    Map<String, String> headers = {...RequestBuilder.headers};
    headers.putIfAbsent(
        "Content-Type", () => "application/x-www-form-urlencoded");
    String bodyStr = xdrParameterName +
        "=" +
        Uri.encodeComponent(absTransaction.toEnvelopeXdrBase64());
    SubmitUriSchemeTransactionResponse result = await httpClient
        .post(serverURI, body: bodyStr, headers: headers)
        .then((response) {
      return SubmitUriSchemeTransactionResponse(null, response);
    }).catchError((onError) {
      throw onError;
    });
    return result;
  } else {
    StellarSDK sdk =
        net == Network.PUBLIC ? StellarSDK.PUBLIC : StellarSDK.TESTNET;
    if (absTransaction is Transaction) {
      SubmitTransactionResponse submitTransactionResponse =
          await sdk.submitTransaction(absTransaction);
      return SubmitUriSchemeTransactionResponse(
          submitTransactionResponse, null);
    } else if (absTransaction is FeeBumpTransaction) {
      SubmitTransactionResponse submitTransactionResponse =
          await sdk.submitFeeBumpTransaction(absTransaction);
      return SubmitUriSchemeTransactionResponse(
          submitTransactionResponse, null);
    } else {
      throw ArgumentError("Unsupported transaction type");
    }
  }
}