withdraw method

Future<SEP24InteractiveResponse> withdraw(
  1. SEP24WithdrawRequest request
)

This operation allows a user to redeem an asset currently on the Stellar network for the real asset (BTC, USD, stock, etc...) via the anchor of the Stellar asset. The withdraw endpoint allows a wallet to get withdrawal information from an anchor, so a user has all the information needed to initiate a withdrawal. It also lets the anchor specify the url for the interactive webapp to continue with the anchor's side of the withdraw.

Throws a RequestErrorException if the server responds with an error and corresponding error message. Throws a SEP24AuthenticationRequiredException if the server responds with an authentication_required error.

Implementation

Future<SEP24InteractiveResponse> withdraw(
    SEP24WithdrawRequest request) async {
  Uri serverURI = Util.appendEndpointToUrl(
      _transferServiceAddress, 'transactions/withdraw/interactive');

  _PostRequestBuilder requestBuilder =
      _PostRequestBuilder(httpClient, serverURI);

  final Map<String, String> fields = {"asset_code": request.assetCode};
  final Map<String, Uint8List> files = {};

  if (request.destinationAsset != null) {
    fields["destination_asset"] = request.destinationAsset!;
  }

  if (request.assetIssuer != null) {
    fields["asset_issuer"] = request.assetIssuer!;
  }

  if (request.amount != null) {
    fields["amount"] = request.amount!;
  }

  if (request.quoteId != null) {
    fields["quote_id"] = request.quoteId!;
  }

  if (request.account != null) {
    fields["account"] = request.account!;
  }

  if (request.memo != null) {
    fields["memo"] = request.memo!;
  }

  if (request.memoType != null) {
    fields["memo_type"] = request.memoType!;
  }

  if (request.walletName != null) {
    fields["wallet_name"] = request.walletName!;
  }

  if (request.walletUrl != null) {
    fields["wallet_url"] = request.walletUrl!;
  }

  if (request.lang != null) {
    fields["lang"] = request.lang!;
  }

  if (request.refundMemo != null) {
    fields["refund_memo"] = request.refundMemo!;
  }

  if (request.refundMemoType != null) {
    fields["refund_memo_type"] = request.refundMemoType!;
  }

  if (request.kycFields != null &&
      request.kycFields?.naturalPersonKYCFields != null) {
    fields.addAll(request.kycFields!.naturalPersonKYCFields!.fields());
  }
  if (request.kycFields != null &&
      request.kycFields?.organizationKYCFields != null) {
    fields.addAll(request.kycFields!.organizationKYCFields!.fields());
  }
  if (request.customFields != null) {
    fields.addAll(request.customFields!);
  }

  // files always at the end.
  if (request.kycFields != null &&
      request.kycFields?.naturalPersonKYCFields != null) {
    files.addAll(request.kycFields!.naturalPersonKYCFields!.files());
  }
  if (request.kycFields != null &&
      request.kycFields?.organizationKYCFields != null) {
    files.addAll(request.kycFields!.organizationKYCFields!.files());
  }
  if (request.customFiles != null) {
    files.addAll(request.customFiles!);
  }

  SEP24InteractiveResponse response;
  try {
    response = await requestBuilder
        .forFields(fields)
        .forFiles(files)
        .execute(request.jwt);
  } on ErrorResponse catch (e) {
    if (e.code == 403) {
      _handleForbiddenResponse(e);
    } else if (e.code != 200) {
      _handleErrorResponse(e);
    }
    throw e;
  }
  return response;
}