deposit method

A deposit is when a user sends an external token (BTC via Bitcoin, USD via bank transfer, etc...) to an address held by an anchor. In turn, the anchor sends an equal amount of tokens on the Stellar network (minus fees) to the user's Stellar account. The deposit endpoint allows a wallet to get deposit information from an anchor, so a user has all the information needed to initiate a deposit. It also lets the anchor specify additional information that the user must submit interactively via a popup or embedded browser window to be able to deposit.

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> deposit(SEP24DepositRequest request) async {
  Uri serverURI = Util.appendEndpointToUrl(
      _transferServiceAddress, 'transactions/deposit/interactive');

  _PostRequestBuilder requestBuilder =
      _PostRequestBuilder(httpClient, serverURI);

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

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

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

  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.memoType != null) {
    fields["memo_type"] = request.memoType!;
  }

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

  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.claimableBalanceSupported != null) {
    fields["claimable_balance_supported"] =
        request.claimableBalanceSupported!;
  }

  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;
}