/*
  This file is part of TALER
  Copyright (C) 2022 Taler Systems SA
  TALER is free software; you can redistribute it and/or modify it under the
  terms of the GNU Affero General Public License as published by the Free Software
  Foundation; either version 3, or (at your option) any later version.
  TALER is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more details.
  You should have received a copy of the GNU Affero General Public License along with
  TALER; see the file COPYING.  If not, see 
*/
/**
 * @file taler-exchange-httpd_common_deposit.h
 * @brief shared logic for handling deposited coins
 * @author Christian Grothoff
 */
#ifndef TALER_EXCHANGE_HTTPD_COMMON_DEPOSIT_H
#define TALER_EXCHANGE_HTTPD_COMMON_DEPOSIT_H
#include 
#include 
#include 
#include 
#include "taler_json_lib.h"
#include "taler_mhd_lib.h"
/**
 * Information about an individual coin being deposited.
 */
struct TEH_PurseDepositedCoin
{
  /**
   * Public information about the coin.
   */
  struct TALER_CoinPublicInfo cpi;
  /**
   * Signature affirming spending the coin.
   */
  struct TALER_CoinSpendSignatureP coin_sig;
  /**
   * Amount to be put into the purse from this coin.
   */
  struct TALER_Amount amount;
  /**
   * Deposit fee applicable for this coin.
   */
  struct TALER_Amount deposit_fee;
  /**
   * Amount to be put into the purse from this coin.
   */
  struct TALER_Amount amount_minus_fee;
  /**
   * Age attestation provided, set if @e no_attest is false.
   */
  struct TALER_AgeAttestation attest;
  /**
   * Age commitment provided, set if @e cpi.no_age_commitment is false.
   */
  struct TALER_AgeCommitment age_commitment;
  /**
   * ID of the coin in known_coins.
   */
  uint64_t known_coin_id;
  /**
   * True if @e attest was not provided.
   */
  bool no_attest;
};
/**
 * Parse a coin and check signature of the coin and the denomination
 * signature over the coin.
 *
 * @param[in,out] connection our HTTP connection
 * @param[out] coin coin to initialize
 * @param jcoin coin to parse
 * @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
 *         #GNUNET_SYSERR on failure and no error could be returned
 */
enum GNUNET_GenericReturnValue
TEH_common_purse_deposit_parse_coin (
  struct MHD_Connection *connection,
  struct TEH_PurseDepositedCoin *coin,
  const json_t *jcoin);
/**
 * Check that the deposited @a coin is valid for @a purse_pub
 * and has a valid age commitment for @a min_age.
 *
 * @param[in,out] connection our HTTP connection
 * @param coin the coin to evaluate
 * @param purse_pub public key of the purse the coin was deposited into
 * @param min_age minimum age restriction expected for this purse
 * @return #GNUNET_OK on success, #GNUNET_NO if an error was returned,
 *         #GNUNET_SYSERR on failure and no error could be returned
 */
enum GNUNET_GenericReturnValue
TEH_common_deposit_check_purse_deposit (
  struct MHD_Connection *connection,
  const struct TEH_PurseDepositedCoin *coin,
  const struct TALER_PurseContractPublicKeyP *purse_pub,
  uint32_t min_age);
/**
 * Release data structures of @a coin. Note that
 * @a coin itself is NOT freed.
 *
 * @param[in] coin information to release
 */
void
TEH_common_purse_deposit_free_coin (struct TEH_PurseDepositedCoin *coin);
#endif