commit e57a1fe882d0c3baa2cd95148e49c4df38893f28
parent 5090b821de7b755aaa431def62a5a8802a3cdd3b
Author: Matyja Lukas Adam <lukas.matyja@students.bfh.ch>
Date: Mon, 18 Sep 2023 12:12:06 +0200
some deletions to the headers
Diffstat:
6 files changed, 6861 insertions(+), 7461 deletions(-)
diff --git a/src/include/taler_donau_service.h b/src/include/taler_donau_service.h
@@ -0,0 +1,6661 @@
+/*
+ This file is part of TALER
+ Copyright (C) 2014-2023 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 <http://www.gnu.org/licenses/>
+ */
+/**
+ * @file include/taler_donau_service.h
+ * @brief C interface of libtalerdonau, a C library to use donau's HTTP API
+ * @author Sree Harsha Totakura <sreeharsha@totakura.in>
+ * @author Christian Grothoff
+ * @author Özgür Kesim
+ */
+#ifndef _TALER_DONAU_SERVICE_H
+#define _TALER_DONAU_SERVICE_H
+
+#include <jansson.h>
+#include "taler_util.h"
+#include "taler_error_codes.h"
+#include "taler_kyclogic_lib.h"
+#include <gnunet/gnunet_curl_lib.h>
+
+
+/* ********************* /keys *********************** */
+
+
+/**
+ * @brief Donau's signature key
+ */
+struct TALER_DONAU_SigningPublicKey
+{
+ /**
+ * The signing public key
+ */
+ struct TALER_DonauPublicKeyP key;
+
+ /**
+ * Signature over this signing key by the donau's master signature.
+ */
+ struct TALER_MasterSignatureP master_sig;
+
+ /**
+ * Validity start time
+ */
+ struct GNUNET_TIME_Timestamp valid_from;
+
+ /**
+ * Validity expiration time (how long the donau may use it).
+ */
+ struct GNUNET_TIME_Timestamp valid_until;
+
+ /**
+ * Validity expiration time for legal disputes.
+ */
+ struct GNUNET_TIME_Timestamp valid_legal;
+};
+
+
+/**
+ * @brief Public information about a donau's denomination key
+ */
+struct TALER_DONAU_DenomPublicKey
+{
+ /**
+ * The public key
+ */
+ struct TALER_DenominationPublicKey key;
+
+ /**
+ * The hash of the public key.
+ */
+ struct TALER_DenominationHashP h_key;
+
+ /**
+ * Donau's master signature over this denomination record.
+ */
+ struct TALER_MasterSignatureP master_sig;
+
+ /**
+ * Timestamp indicating when the denomination key becomes valid
+ */
+ struct GNUNET_TIME_Timestamp valid_from;
+
+ /**
+ * Timestamp indicating when the denomination key can’t be used anymore to
+ * withdraw new coins.
+ */
+ struct GNUNET_TIME_Timestamp withdraw_valid_until;
+
+ /**
+ * Timestamp indicating when coins of this denomination become invalid.
+ */
+ struct GNUNET_TIME_Timestamp expire_deposit;
+
+ /**
+ * When do signatures with this denomination key become invalid?
+ * After this point, these signatures cannot be used in (legal)
+ * disputes anymore, as the Exchange is then allowed to destroy its side
+ * of the evidence. @e expire_legal is expected to be significantly
+ * larger than @e expire_deposit (by a year or more).
+ */
+ struct GNUNET_TIME_Timestamp expire_legal;
+
+ /**
+ * The value of this denomination
+ */
+ struct TALER_Amount value;
+
+ /**
+ * The applicable fees for this denomination
+ */
+ struct TALER_DenomFeeSet fees;
+
+ /**
+ * Set to true if the private denomination key has been
+ * lost by the donau and thus the key cannot be
+ * used for withdrawing at this time.
+ */
+ bool lost;
+
+ /**
+ * Set to true if this denomination key has been
+ * revoked by the donau.
+ */
+ bool revoked;
+
+};
+
+
+/**
+ * Information we track per denomination audited by the auditor.
+ */
+struct TALER_DONAU_AuditorDenominationInfo
+{
+
+ /**
+ * Signature by the auditor affirming that it is monitoring this
+ * denomination.
+ */
+ struct TALER_AuditorSignatureP auditor_sig;
+
+ /**
+ * Offsets into the key's main `denom_keys` array identifying the
+ * denomination being audited by this auditor.
+ */
+ unsigned int denom_key_offset;
+
+};
+
+
+/**
+ * @brief Information we get from the donau about auditors.
+ */
+struct TALER_DONAU_AuditorInformation
+{
+ /**
+ * Public key of the auditing institution. Wallets and merchants
+ * are expected to be configured with a set of public keys of
+ * auditors that they deem acceptable. These public keys are
+ * the roots of the Taler PKI.
+ */
+ struct TALER_AuditorPublicKeyP auditor_pub;
+
+ /**
+ * URL of the auditing institution. Signed by the auditor's public
+ * key, this URL is a place where applications can direct users for
+ * additional information about the auditor. In the future, there
+ * should also be an auditor API for automated submission about
+ * claims of misbehaving donau providers.
+ */
+ char *auditor_url;
+
+ /**
+ * Array of length @a num_denom_keys with the denomination
+ * keys audited by this auditor.
+ */
+ struct TALER_DONAU_AuditorDenominationInfo *denom_keys;
+
+ /**
+ * Number of denomination keys audited by this auditor.
+ */
+ unsigned int num_denom_keys;
+};
+
+
+/**
+ * @brief Information about keys from the donau.
+ */
+struct TALER_DONAU_Keys
+{
+
+ /**
+ * Long-term offline signing key of the donau.
+ */
+ struct TALER_MasterPublicKeyP master_pub;
+
+ /**
+ * Signature over extension configuration data, if any.
+ */
+ struct TALER_MasterSignatureP extensions_sig;
+
+ /**
+ * Array of the donau's online signing keys.
+ */
+ struct TALER_DONAU_SigningPublicKey *sign_keys;
+
+ /**
+ * Array of the donau's denomination keys.
+ */
+ struct TALER_DONAU_DenomPublicKey *denom_keys;
+
+ /**
+ * Array of the keys of the auditors of the donau.
+ */
+ struct TALER_DONAU_AuditorInformation *auditors;
+
+ /**
+ * Array with the global fees of the donau.
+ */
+ struct TALER_DONAU_GlobalFee *global_fees;
+
+ /**
+ * Configuration data for extensions.
+ */
+ json_t *extensions;
+
+ /**
+ * Supported Taler protocol version by the donau.
+ * String in the format current:revision:age using the
+ * semantics of GNU libtool. See
+ * https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
+ */
+ char *version;
+
+ /**
+ * Supported currency of the donau.
+ */
+ char *currency;
+
+ /**
+ * What is the base URL of the donau that returned
+ * these keys?
+ */
+ char *donau_url;
+
+ /**
+ * Asset type used by the donau. Typical values
+ * are "fiat" or "crypto" or "regional" or "stock".
+ * Wallets should adjust their UI/UX based on this
+ * value.
+ */
+ char *asset_type;
+
+ /**
+ * Array of amounts a wallet is allowed to hold from
+ * this donau before it must undergo further KYC checks.
+ */
+ struct TALER_Amount *wallet_balance_limit_without_kyc;
+
+ /**
+ * Array of accounts of the donau.
+ */
+ struct TALER_DONAU_WireAccount *accounts;
+
+ /**
+ * Array of wire fees by wire method.
+ */
+ struct TALER_DONAU_WireFeesByMethod *fees;
+
+ /**
+ * How long after a reserve went idle will the donau close it?
+ * This is an approximate number, not cryptographically signed by
+ * the donau (advisory-only, may change anytime).
+ */
+ struct GNUNET_TIME_Relative reserve_closing_delay;
+
+ /**
+ * Timestamp indicating the /keys generation.
+ */
+ struct GNUNET_TIME_Timestamp list_issue_date;
+
+ /**
+ * When does this keys data expire?
+ */
+ struct GNUNET_TIME_Timestamp key_data_expiration;
+
+ /**
+ * Timestamp indicating the creation time of the last
+ * denomination key in /keys.
+ * Used to fetch /keys incrementally.
+ */
+ struct GNUNET_TIME_Timestamp last_denom_issue_date;
+
+ /**
+ * If age restriction is enabled on the donau, we get an non-zero age_mask
+ */
+ struct TALER_AgeMask age_mask;
+
+ /**
+ * Absolute STEFAN parameter.
+ */
+ struct TALER_Amount stefan_abs;
+
+ /**
+ * Logarithmic STEFAN parameter.
+ */
+ struct TALER_Amount stefan_log;
+
+ /**
+ * Linear STEFAN parameter.
+ */
+ struct TALER_Amount stefan_lin;
+
+ /**
+ * Default number of fractional digits to render
+ * amounts with.
+ */
+ uint32_t currency_fraction_digits;
+
+ /**
+ * Length of @e accounts array.
+ */
+ unsigned int accounts_len;
+
+ /**
+ * Length of @e fees array.
+ */
+ unsigned int fees_len;
+
+ /**
+ * Length of the @e wallet_balance_limit_without_kyc
+ * array.
+ */
+ unsigned int wblwk_length;
+
+ /**
+ * Length of the @e global_fees array.
+ */
+ unsigned int num_global_fees;
+
+ /**
+ * Length of the @e sign_keys array (number of valid entries).
+ */
+ unsigned int num_sign_keys;
+
+ /**
+ * Length of the @e denom_keys array.
+ */
+ unsigned int num_denom_keys;
+
+ /**
+ * Length of the @e auditors array.
+ */
+ unsigned int num_auditors;
+
+ /**
+ * Actual length of the @e auditors array (size of allocation).
+ */
+ unsigned int auditors_size;
+
+ /**
+ * Actual length of the @e denom_keys array (size of allocation).
+ */
+ unsigned int denom_keys_size;
+
+ /**
+ * Reference counter for this structure.
+ * Freed when it reaches 0.
+ */
+ unsigned int rc;
+
+ /**
+ * Set to true if rewards are allowed at this donau.
+ */
+ bool rewards_allowed;
+};
+
+
+/**
+ * How compatible are the protocol version of the donau and this
+ * client? The bits (1,2,4) can be used to test if the donau's
+ * version is incompatible, older or newer respectively.
+ */
+enum TALER_DONAU_VersionCompatibility
+{
+
+ /**
+ * The donau runs exactly the same protocol version.
+ */
+ TALER_DONAU_VC_MATCH = 0,
+
+ /**
+ * The donau is too old or too new to be compatible with this
+ * implementation (bit)
+ */
+ TALER_DONAU_VC_INCOMPATIBLE = 1,
+
+ /**
+ * The donau is older than this implementation (bit)
+ */
+ TALER_DONAU_VC_OLDER = 2,
+
+ /**
+ * The donau is too old to be compatible with
+ * this implementation.
+ */
+ TALER_DONAU_VC_INCOMPATIBLE_OUTDATED
+ = TALER_DONAU_VC_INCOMPATIBLE
+ | TALER_DONAU_VC_OLDER,
+
+ /**
+ * The donau is more recent than this implementation (bit).
+ */
+ TALER_DONAU_VC_NEWER = 4,
+
+ /**
+ * The donau is too recent for this implementation.
+ */
+ TALER_DONAU_VC_INCOMPATIBLE_NEWER
+ = TALER_DONAU_VC_INCOMPATIBLE
+ | TALER_DONAU_VC_NEWER,
+
+ /**
+ * We could not even parse the version data.
+ */
+ TALER_DONAU_VC_PROTOCOL_ERROR = 8
+
+};
+
+
+/**
+ * General information about the HTTP response we obtained
+ * from the donau for a request.
+ */
+struct TALER_DONAU_HttpResponse
+{
+
+ /**
+ * The complete JSON reply. NULL if we failed to parse the
+ * reply (too big, invalid JSON).
+ */
+ const json_t *reply;
+
+ /**
+ * Set to the human-readable 'hint' that is optionally
+ * provided by the donau together with errors. NULL
+ * if no hint was provided or if there was no error.
+ */
+ const char *hint;
+
+ /**
+ * HTTP status code for the response. 0 if the
+ * HTTP request failed and we did not get any answer, or
+ * if the answer was invalid and we set @a ec to a
+ * client-side error code.
+ */
+ unsigned int http_status;
+
+ /**
+ * Taler error code. #TALER_EC_NONE if everything was
+ * OK. Usually set to the "code" field of an error
+ * response, but may be set to values created at the
+ * client side, for example when the response was
+ * not in JSON format or was otherwise ill-formed.
+ */
+ enum TALER_ErrorCode ec;
+
+};
+
+
+/**
+ * Response from /keys.
+ */
+struct TALER_DONAU_KeysResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP status code.
+ */
+ union
+ {
+
+ /**
+ * Details on #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Information about the various keys used by the donau.
+ */
+ const struct TALER_DONAU_Keys *keys;
+
+ /**
+ * Protocol compatibility information
+ */
+ enum TALER_DONAU_VersionCompatibility compat;
+ } ok;
+ } details;
+
+};
+
+
+/**
+ * Function called with information about who is auditing
+ * a particular donau and what keys the donau is using.
+ * The ownership over the @a keys object is passed to
+ * the callee, thus it is given explicitly and not
+ * (only) via @a kr.
+ *
+ * @param cls closure
+ * @param kr response from /keys
+ * @param[in] keys keys object passed to callback with
+ * reference counter of 1. Must be freed by callee
+ * using #TALER_DONAU_keys_decref(). NULL on failure.
+ */
+typedef void
+(*TALER_DONAU_GetKeysCallback) (
+ void *cls,
+ const struct TALER_DONAU_KeysResponse *kr,
+ struct TALER_DONAU_Keys *keys);
+
+
+/**
+ * @brief Handle for a GET /keys request.
+ */
+struct TALER_DONAU_GetKeysHandle;
+
+
+/**
+ * Fetch the main /keys resources from an donau. Does an incremental
+ * fetch if @a last_keys is given. The obtained information will be passed to
+ * the @a cert_cb (possibly after first merging it with @a last_keys to
+ * produce a full picture; expired keys (for deposit) will be removed from @a
+ * last_keys if there are any).
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param[in,out] last_keys previous keys object, NULL for none
+ * @param cert_cb function to call with the donau's certification information,
+ * possibly called repeatedly if the information changes
+ * @param cert_cb_cls closure for @a cert_cb
+ * @return the donau handle; NULL upon error
+ */
+struct TALER_DONAU_GetKeysHandle *
+TALER_DONAU_get_keys (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *last_keys,
+ TALER_DONAU_GetKeysCallback cert_cb,
+ void *cert_cb_cls);
+
+
+/**
+ * Serialize the latest data from @a keys to be persisted
+ * (for example, to be used as @a last_keys later).
+ *
+ * @param kd the key data to serialize
+ * @return NULL on error; otherwise JSON object owned by the caller
+ */
+json_t *
+TALER_DONAU_keys_to_json (const struct TALER_DONAU_Keys *kd);
+
+
+/**
+ * Deserialize keys data stored in @a j.
+ *
+ * @param j JSON keys data previously returned from #TALER_DONAU_keys_to_json()
+ * @return NULL on error (i.e. invalid JSON); otherwise
+ * keys object with reference counter 1 owned by the caller
+ */
+struct TALER_DONAU_Keys *
+TALER_DONAU_keys_from_json (const json_t *j);
+
+
+/**
+ * Cancel GET /keys operation.
+ *
+ * @param[in] gkh the GET /keys handle
+ */
+void
+TALER_DONAU_get_keys_cancel (struct TALER_DONAU_GetKeysHandle *gkh);
+
+
+/**
+ * Increment reference counter for @a keys
+ *
+ * @param[in,out] keys object to increment reference counter for
+ * @return keys, with incremented reference counter
+ */
+struct TALER_DONAU_Keys *
+TALER_DONAU_keys_incref (struct TALER_DONAU_Keys *keys);
+
+
+/**
+ * Decrement reference counter for @a keys.
+ * Frees @a keys if reference counter becomes zero.
+ *
+ * @param[in,out] keys object to decrement reference counter for
+ */
+void
+TALER_DONAU_keys_decref (struct TALER_DONAU_Keys *keys);
+
+/**
+ * Test if the given @a pub is a the current signing key from the donau
+ * according to @a keys.
+ *
+ * @param keys the donau's key set
+ * @param pub claimed current online signing key for the donau
+ * @return #GNUNET_OK if @a pub is (according to /keys) a current signing key
+ */
+enum GNUNET_GenericReturnValue
+TALER_DONAU_test_signing_key (
+ const struct TALER_DONAU_Keys *keys,
+ const struct TALER_ExchangePublicKeyP *pub);
+
+
+/**
+ * Obtain the denomination key details from the donau.
+ *
+ * @param keys the donau's key set
+ * @param pk public key of the denomination to lookup
+ * @return details about the given denomination key, NULL if the key is not
+ * found
+ */
+const struct TALER_DONAU_DenomPublicKey *
+TALER_DONAU_get_denomination_key (
+ const struct TALER_DONAU_Keys *keys,
+ const struct TALER_DenominationPublicKey *pk);
+
+
+/**
+ * Create a copy of a denomination public key.
+ *
+ * @param key key to copy
+ * @returns a copy, must be freed with #TALER_DONAU_destroy_denomination_key()
+ * @deprecated
+ */
+struct TALER_DONAU_DenomPublicKey *
+TALER_DONAU_copy_denomination_key (
+ const struct TALER_DONAU_DenomPublicKey *key);
+
+
+/**
+ * Destroy a denomination public key.
+ * Should only be called with keys created by #TALER_DONAU_copy_denomination_key().
+ *
+ * @param key key to destroy.
+ * @deprecated
+ */
+void
+TALER_DONAU_destroy_denomination_key (
+ struct TALER_DONAU_DenomPublicKey *key);
+
+
+/**
+ * Obtain the denomination key details from the donau.
+ *
+ * @param keys the donau's key set
+ * @param hc hash of the public key of the denomination to lookup
+ * @return details about the given denomination key
+ */
+const struct TALER_DONAU_DenomPublicKey *
+TALER_DONAU_get_denomination_key_by_hash (
+ const struct TALER_DONAU_Keys *keys,
+ const struct TALER_DenominationHashP *hc);
+
+
+/**
+ * Obtain meta data about an donau (online) signing
+ * key.
+ *
+ * @param keys from where to obtain the meta data
+ * @param donau_pub public key to lookup
+ * @return NULL on error (@a donau_pub not known)
+ */
+const struct TALER_DONAU_SigningPublicKey *
+TALER_DONAU_get_signing_key_info (
+ const struct TALER_DONAU_Keys *keys,
+ const struct TALER_ExchangePublicKeyP *donau_pub);
+
+
+/* ********************* wire helpers *********************** */
+
+
+/**
+ * Parse array of @a accounts of the donau into @a was.
+ *
+ * @param master_pub master public key of the donau, NULL to not verify signatures
+ * @param accounts array of accounts to parse
+ * @param[out] was where to write the result (already allocated)
+ * @param was_length length of the @a was array, must match the length of @a accounts
+ * @return #GNUNET_OK if parsing @a accounts succeeded
+ */
+enum GNUNET_GenericReturnValue
+TALER_DONAU_parse_accounts (
+ const struct TALER_MasterPublicKeyP *master_pub,
+ const json_t *accounts,
+ unsigned int was_length,
+ struct TALER_DONAU_WireAccount was[static was_length]);
+
+
+/**
+ * Free data within @a was, but not @a was itself.
+ *
+ * @param was array of wire account data
+ * @param was_len length of the @a was array
+ */
+void
+TALER_DONAU_free_accounts (
+ unsigned int was_len,
+ struct TALER_DONAU_WireAccount was[static was_len]);
+
+
+/* ********************* /coins/$COIN_PUB/deposit *********************** */
+
+
+/**
+ * Information needed for a coin to be deposited.
+ */
+struct TALER_DONAU_CoinDepositDetail
+{
+
+ /**
+ * The amount to be deposited.
+ */
+ struct TALER_Amount amount;
+
+ /**
+ * Hash over the age commitment of the coin.
+ */
+ struct TALER_AgeCommitmentHash h_age_commitment;
+
+ /**
+ * The coin’s public key.
+ */
+ struct TALER_CoinSpendPublicKeyP coin_pub;
+
+ /**
+ * The signature made with purpose #TALER_SIGNATURE_WALLET_COIN_DEPOSIT made
+ * by the customer with the coin’s private key.
+ */
+ struct TALER_CoinSpendSignatureP coin_sig;
+
+ /**
+ * Exchange’s unblinded signature of the coin.
+ */
+ struct TALER_DenominationSignature denom_sig;
+
+ /**
+ * Hash of the public key of the coin.
+ */
+ struct TALER_DenominationHashP h_denom_pub;
+};
+
+
+/**
+ * Meta information about the contract relevant for a coin's deposit
+ * operation.
+ */
+struct TALER_DONAU_DepositContractDetail
+{
+
+ /**
+ * Hash of the contact of the merchant with the customer (further details
+ * are never disclosed to the donau)
+ */
+ struct TALER_PrivateContractHashP h_contract_terms;
+
+ /**
+ * The public key of the merchant (used to identify the merchant for refund
+ * requests).
+ */
+ struct TALER_MerchantPublicKeyP merchant_pub;
+
+ /**
+ * Salt used to hash the @e merchant_payto_uri.
+ */
+ struct TALER_WireSaltP wire_salt;
+
+ /**
+ * Hash over data provided by the wallet to customize the contract.
+ * All zero if not used.
+ */
+ struct GNUNET_HashCode wallet_data_hash;
+
+ /**
+ * Date until which the merchant can issue a refund to the customer via the
+ * donau (can be zero if refunds are not allowed); must not be after the
+ * @e wire_deadline.
+ */
+ struct GNUNET_TIME_Timestamp refund_deadline;
+
+ /**
+ * Execution date, until which the merchant would like the donau to
+ * settle the balance (advisory, the donau cannot be forced to settle in
+ * the past or upon very short notice, but of course a well-behaved donau
+ * will limit aggregation based on the advice received).
+ */
+ struct GNUNET_TIME_Timestamp wire_deadline;
+
+ /**
+ * Timestamp when the contract was finalized, must match approximately the
+ * current time of the donau.
+ */
+ struct GNUNET_TIME_Timestamp wallet_timestamp;
+
+ /**
+ * The merchant’s account details, in the payto://-format supported by the
+ * donau.
+ */
+ const char *merchant_payto_uri;
+
+ /**
+ * Policy extension specific details about the deposit relevant to the donau.
+ */
+ const json_t *policy_details;
+
+};
+
+
+/**
+ * @brief A Batch Deposit Handle
+ */
+struct TALER_DONAU_BatchDepositHandle;
+
+
+/**
+ * Structure with information about a batch deposit
+ * operation's result.
+ */
+struct TALER_DONAU_BatchDepositResult
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ union
+ {
+
+ /**
+ * Information returned if the HTTP status is
+ * #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Time when the donau generated the batch deposit confirmation
+ */
+ struct GNUNET_TIME_Timestamp deposit_timestamp;
+
+ /**
+ * Array of signatures provided by the donau
+ */
+ const struct TALER_ExchangeSignatureP *donau_sigs;
+
+ /**
+ * donau key used to sign @a donau_sig.
+ */
+ const struct TALER_ExchangePublicKeyP *donau_pub;
+
+ /**
+ * Base URL for looking up wire transfers, or
+ * NULL to use the default base URL.
+ */
+ const char *transaction_base_url;
+
+ /**
+ * Length of the @e donau_sigs array.
+ */
+ unsigned int num_signatures;
+
+ } ok;
+
+ /**
+ * Information returned if the HTTP status is
+ * #MHD_HTTP_CONFLICT.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } conflict;
+
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * deposit permission request to a donau.
+ *
+ * @param cls closure
+ * @param dr deposit response details
+ */
+typedef void
+(*TALER_DONAU_BatchDepositResultCallback) (
+ void *cls,
+ const struct TALER_DONAU_BatchDepositResult *dr);
+
+
+/**
+ * Submit a batch of deposit permissions to the donau and get the
+ * donau's response. This API is typically used by a merchant. Note that
+ * while we return the response verbatim to the caller for further processing,
+ * we do already verify that the response is well-formed (i.e. that signatures
+ * included in the response are all valid). If the donau's reply is not
+ * well-formed, we return an HTTP status code of zero to @a cb.
+ *
+ * We also verify that the @a cdds.coin_sig are valid for this deposit
+ * request, and that the @a cdds.ub_sig are a valid signatures for @a
+ * coin_pub. Also, the @a donau must be ready to operate (i.e. have
+ * finished processing the /keys reply). If either check fails, we do
+ * NOT initiate the transaction with the donau and instead return NULL.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param dcd details about the contract the deposit is for
+ * @param num_cdds length of the @a cdds array
+ * @param cdds array with details about the coins to be deposited
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @param[out] ec if NULL is returned, set to the error code explaining why the operation failed
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_BatchDepositHandle *
+TALER_DONAU_batch_deposit (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_DONAU_DepositContractDetail *dcd,
+ unsigned int num_cdds,
+ const struct TALER_DONAU_CoinDepositDetail cdds[static num_cdds],
+ TALER_DONAU_BatchDepositResultCallback cb,
+ void *cb_cls,
+ enum TALER_ErrorCode *ec);
+
+
+/**
+ * Change the chance that our deposit confirmation will be given to the
+ * auditor to 100%.
+ *
+ * @param[in,out] deposit the batch deposit permission request handle
+ */
+void
+TALER_DONAU_batch_deposit_force_dc (
+ struct TALER_DONAU_BatchDepositHandle *deposit);
+
+
+/**
+ * Cancel a batch deposit permission request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param[in] deposit the deposit permission request handle
+ */
+void
+TALER_DONAU_batch_deposit_cancel (
+ struct TALER_DONAU_BatchDepositHandle *deposit);
+
+
+/* ********************* /coins/$COIN_PUB/refund *********************** */
+
+/**
+ * @brief A Refund Handle
+ */
+struct TALER_DONAU_RefundHandle;
+
+/**
+ * Response from the /refund API.
+ */
+struct TALER_DONAU_RefundResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status code.
+ */
+ union
+ {
+ /**
+ * Details on #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Exchange key used to sign.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * The actual signature
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+ } ok;
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * refund request to an donau.
+ *
+ * @param cls closure
+ * @param rr refund response
+ */
+typedef void
+(*TALER_DONAU_RefundCallback) (
+ void *cls,
+ const struct TALER_DONAU_RefundResponse *rr);
+
+/**
+ * Submit a refund request to the donau and get the donau's response.
+ * This API is used by a merchant. Note that while we return the response
+ * verbatim to the caller for further processing, we do already verify that
+ * the response is well-formed (i.e. that signatures included in the response
+ * are all valid). If the donau's reply is not well-formed, we return an
+ * HTTP status code of zero to @a cb.
+ *
+ * The @a donau must be ready to operate (i.e. have
+ * finished processing the /keys reply). If this check fails, we do
+ * NOT initiate the transaction with the donau and instead return NULL.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param amount the amount to be refunded; must be larger than the refund fee
+ * (as that fee is still being subtracted), and smaller than the amount
+ * (with deposit fee) of the original deposit contribution of this coin
+ * @param h_contract_terms hash of the contact of the merchant with the customer that is being refunded
+ * @param coin_pub coin’s public key of the coin from the original deposit operation
+ * @param rtransaction_id transaction id for the transaction between merchant and customer (of refunding operation);
+ * this is needed as we may first do a partial refund and later a full refund. If both
+ * refunds are also over the same amount, we need the @a rtransaction_id to make the disjoint
+ * refund requests different (as requests are idempotent and otherwise the 2nd refund might not work).
+ * @param merchant_priv the private key of the merchant, used to generate signature for refund request
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_RefundHandle *
+TALER_DONAU_refund (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_Amount *amount,
+ const struct TALER_PrivateContractHashP *h_contract_terms,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ uint64_t rtransaction_id,
+ const struct TALER_MerchantPrivateKeyP *merchant_priv,
+ TALER_DONAU_RefundCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a refund permission request. This function cannot be used
+ * on a request handle if a response is already served for it. If
+ * this function is called, the refund may or may not have happened.
+ * However, it is fine to try to refund the coin a second time.
+ *
+ * @param refund the refund request handle
+ */
+void
+TALER_DONAU_refund_cancel (struct TALER_DONAU_RefundHandle *refund);
+
+
+/* ********************* POST /csr-melt *********************** */
+
+
+/**
+ * @brief A /csr-melt Handle
+ */
+struct TALER_DONAU_CsRMeltHandle;
+
+
+/**
+ * Details about a response for a CS R request.
+ */
+struct TALER_DONAU_CsRMeltResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response.
+ */
+ union
+ {
+ /**
+ * Details if the status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Length of the @e alg_values array.
+ */
+ unsigned int alg_values_len;
+
+ /**
+ * Values contributed by the donau for the
+ * respective coin's withdraw operation.
+ */
+ const struct TALER_ExchangeWithdrawValues *alg_values;
+ } ok;
+
+ /**
+ * Details if the status is #MHD_HTTP_GONE.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } gone;
+
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * CS R request to a donau.
+ *
+ * @param cls closure
+ * @param csrr response details
+ */
+typedef void
+(*TALER_DONAU_CsRMeltCallback) (
+ void *cls,
+ const struct TALER_DONAU_CsRMeltResponse *csrr);
+
+
+/**
+ * Information we pass per coin to a /csr-melt request.
+ */
+struct TALER_DONAU_NonceKey
+{
+ /**
+ * Which denomination key is the /csr-melt request for?
+ */
+ const struct TALER_DONAU_DenomPublicKey *pk;
+
+ /**
+ * What is number to derive the client nonce for the
+ * fresh coin?
+ */
+ uint32_t cnc_num;
+};
+
+
+/**
+ * Get a set of CS R values using a /csr-melt request.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param rms master key used for the derivation of the CS values
+ * @param nks_len length of the @a nks array
+ * @param nks array of denominations and nonces
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for the above callback
+ * @return handle for the operation on success, NULL on error, i.e.
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_CsRMeltHandle *
+TALER_DONAU_csr_melt (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_RefreshMasterSecretP *rms,
+ unsigned int nks_len,
+ struct TALER_DONAU_NonceKey nks[static nks_len],
+ TALER_DONAU_CsRMeltCallback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ *
+ * Cancel a CS R melt request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param csrh the withdraw handle
+ */
+void
+TALER_DONAU_csr_melt_cancel (struct TALER_DONAU_CsRMeltHandle *csrh);
+
+
+/* ********************* POST /csr-withdraw *********************** */
+
+
+/**
+ * @brief A /csr-withdraw Handle
+ */
+struct TALER_DONAU_CsRWithdrawHandle;
+
+
+/**
+ * Details about a response for a CS R request.
+ */
+struct TALER_DONAU_CsRWithdrawResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response.
+ */
+ union
+ {
+ /**
+ * Details if the status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Values contributed by the donau for the
+ * respective coin's withdraw operation.
+ */
+ struct TALER_ExchangeWithdrawValues alg_values;
+ } ok;
+
+ /**
+ * Details if the status is #MHD_HTTP_GONE.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } gone;
+
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * CS R withdraw request to a donau.
+ *
+ * @param cls closure
+ * @param csrr response details
+ */
+typedef void
+(*TALER_DONAU_CsRWithdrawCallback) (
+ void *cls,
+ const struct TALER_DONAU_CsRWithdrawResponse *csrr);
+
+
+/**
+ * Get a CS R using a /csr-withdraw request.
+ *
+ * @param curl_ctx The curl context to use for the requests
+ * @param donau_url Base-URL to the excnange
+ * @param pk Which denomination key is the /csr request for
+ * @param nonce client nonce for the request
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for the above callback
+ * @return handle for the operation on success, NULL on error, i.e.
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_CsRWithdrawHandle *
+TALER_DONAU_csr_withdraw (
+ struct GNUNET_CURL_Context *curl_ctx,
+ const char *donau_url,
+ const struct TALER_DONAU_DenomPublicKey *pk,
+ const struct TALER_CsNonce *nonce,
+ TALER_DONAU_CsRWithdrawCallback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ *
+ * Cancel a CS R withdraw request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param csrh the withdraw handle
+ */
+void
+TALER_DONAU_csr_withdraw_cancel (
+ struct TALER_DONAU_CsRWithdrawHandle *csrh);
+
+
+/* ********************* GET /reserves/$RESERVE_PUB *********************** */
+
+/**
+ * Ways how a reserve's balance may change.
+ */
+enum TALER_DONAU_ReserveTransactionType
+{
+
+ /**
+ * Deposit into the reserve.
+ */
+ TALER_DONAU_RTT_CREDIT,
+
+ /**
+ * Withdrawal from the reserve.
+ */
+ TALER_DONAU_RTT_WITHDRAWAL,
+
+ /**
+ * Age-Withdrawal from the reserve.
+ */
+ TALER_DONAU_RTT_AGEWITHDRAWAL,
+
+ /**
+ * /recoup operation.
+ */
+ TALER_DONAU_RTT_RECOUP,
+
+ /**
+ * Reserve closed operation.
+ */
+ TALER_DONAU_RTT_CLOSING,
+
+ /**
+ * Reserve history request.
+ */
+ TALER_DONAU_RTT_HISTORY,
+
+ /**
+ * Reserve purse merge operation.
+ */
+ TALER_DONAU_RTT_MERGE,
+
+ /**
+ * Reserve open request operation.
+ */
+ TALER_DONAU_RTT_OPEN,
+
+ /**
+ * Reserve close request operation.
+ */
+ TALER_DONAU_RTT_CLOSE
+
+};
+
+
+/**
+ * @brief Entry in the reserve's transaction history.
+ */
+struct TALER_DONAU_ReserveHistoryEntry
+{
+
+ /**
+ * Type of the transaction.
+ */
+ enum TALER_DONAU_ReserveTransactionType type;
+
+ /**
+ * Amount transferred (in or out).
+ */
+ struct TALER_Amount amount;
+
+ /**
+ * Details depending on @e type.
+ */
+ union
+ {
+
+ /**
+ * Information about a deposit that filled this reserve.
+ * @e type is #TALER_DONAU_RTT_CREDIT.
+ */
+ struct
+ {
+ /**
+ * Sender account payto://-URL of the incoming transfer.
+ */
+ char *sender_url;
+
+ /**
+ * Information that uniquely identifies the wire transfer.
+ */
+ uint64_t wire_reference;
+
+ /**
+ * When did the wire transfer happen?
+ */
+ struct GNUNET_TIME_Timestamp timestamp;
+
+ } in_details;
+
+ /**
+ * Information about withdraw operation.
+ * @e type is #TALER_DONAU_RTT_WITHDRAWAL.
+ */
+ struct
+ {
+ /**
+ * Signature authorizing the withdrawal for outgoing transaction.
+ */
+ json_t *out_authorization_sig;
+
+ /**
+ * Fee that was charged for the withdrawal.
+ */
+ struct TALER_Amount fee;
+ } withdraw;
+
+ /**
+ * Information about withdraw operation.
+ * @e type is #TALER_DONAU_RTT_AGEWITHDRAWAL.
+ */
+ struct
+ {
+ /**
+ * Signature authorizing the withdrawal for outgoing transaction.
+ */
+ json_t *out_authorization_sig;
+
+ /**
+ * Maximum age committed
+ */
+ uint8_t max_age;
+
+ /**
+ * Fee that was charged for the withdrawal.
+ */
+ struct TALER_Amount fee;
+ } age_withdraw;
+
+ /**
+ * Information provided if the reserve was filled via /recoup.
+ * @e type is #TALER_DONAU_RTT_RECOUP.
+ */
+ struct
+ {
+
+ /**
+ * Public key of the coin that was paid back.
+ */
+ struct TALER_CoinSpendPublicKeyP coin_pub;
+
+ /**
+ * Signature of the coin of type
+ * #TALER_SIGNATURE_DONAU_CONFIRM_RECOUP.
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+ /**
+ * Public key of the donau that was used for @e donau_sig.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * When did the /recoup operation happen?
+ */
+ struct GNUNET_TIME_Timestamp timestamp;
+
+ } recoup_details;
+
+ /**
+ * Information about a close operation of the reserve.
+ * @e type is #TALER_DONAU_RTT_CLOSE.
+ */
+ struct
+ {
+ /**
+ * Receiver account information for the outgoing wire transfer.
+ */
+ const char *receiver_account_details;
+
+ /**
+ * Wire transfer details for the outgoing wire transfer.
+ */
+ struct TALER_WireTransferIdentifierRawP wtid;
+
+ /**
+ * Signature of the coin of type
+ * #TALER_SIGNATURE_DONAU_RESERVE_CLOSED.
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+ /**
+ * Public key of the donau that was used for @e donau_sig.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * When did the wire transfer happen?
+ */
+ struct GNUNET_TIME_Timestamp timestamp;
+
+ /**
+ * Fee that was charged for the closing.
+ */
+ struct TALER_Amount fee;
+
+ } close_details;
+
+ /**
+ * Information about a history operation of the reserve.
+ * @e type is #TALER_DONAU_RTT_HISTORY.
+ */
+ struct
+ {
+
+ /**
+ * When was the request made.
+ */
+ struct GNUNET_TIME_Timestamp request_timestamp;
+
+ /**
+ * Signature by the reserve approving the history request.
+ */
+ struct TALER_ReserveSignatureP reserve_sig;
+
+ } history_details;
+
+ /**
+ * Information about a merge operation on the reserve.
+ * @e type is #TALER_DONAU_RTT_MERGE.
+ */
+ struct
+ {
+
+ /**
+ * Fee paid for the purse.
+ */
+ struct TALER_Amount purse_fee;
+
+ /**
+ * Hash over the contract.
+ */
+ struct TALER_PrivateContractHashP h_contract_terms;
+
+ /**
+ * Merge capability key.
+ */
+ struct TALER_PurseMergePublicKeyP merge_pub;
+
+ /**
+ * Purse public key.
+ */
+ struct TALER_PurseContractPublicKeyP purse_pub;
+
+ /**
+ * Signature by the reserve approving the merge.
+ */
+ struct TALER_ReserveSignatureP reserve_sig;
+
+ /**
+ * When was the merge made.
+ */
+ struct GNUNET_TIME_Timestamp merge_timestamp;
+
+ /**
+ * When was the purse set to expire.
+ */
+ struct GNUNET_TIME_Timestamp purse_expiration;
+
+ /**
+ * Minimum age required for depositing into the purse.
+ */
+ uint32_t min_age;
+
+ /**
+ * Flags of the purse.
+ */
+ enum TALER_WalletAccountMergeFlags flags;
+
+ /**
+ * True if the purse was actually merged, false
+ * if only the @e purse_fee was charged.
+ */
+ bool merged;
+
+ } merge_details;
+
+ /**
+ * Information about an open request operation on the reserve.
+ * @e type is #TALER_DONAU_RTT_OPEN.
+ */
+ struct
+ {
+
+ /**
+ * Signature by the reserve approving the open.
+ */
+ struct TALER_ReserveSignatureP reserve_sig;
+
+ /**
+ * Amount to be paid from the reserve balance to open
+ * the reserve.
+ */
+ struct TALER_Amount reserve_payment;
+
+ /**
+ * When was the request created.
+ */
+ struct GNUNET_TIME_Timestamp request_timestamp;
+
+ /**
+ * For how long should the reserve be kept open.
+ * (Determines amount to be paid.)
+ */
+ struct GNUNET_TIME_Timestamp reserve_expiration;
+
+ /**
+ * How many open purses should be included with the
+ * open reserve?
+ * (Determines amount to be paid.)
+ */
+ uint32_t purse_limit;
+
+ } open_request;
+
+ /**
+ * Information about an close request operation on the reserve.
+ * @e type is #TALER_DONAU_RTT_CLOSE.
+ */
+ struct
+ {
+
+ /**
+ * Signature by the reserve approving the close.
+ */
+ struct TALER_ReserveSignatureP reserve_sig;
+
+ /**
+ * When was the request created.
+ */
+ struct GNUNET_TIME_Timestamp request_timestamp;
+
+ /**
+ * Hash of the payto://-URI of the target account
+ * for the closure, or all zeros for the reserve
+ * origin account.
+ */
+ struct TALER_PaytoHashP target_account_h_payto;
+
+ } close_request;
+
+
+ } details;
+
+};
+
+
+/**
+ * @brief A /reserves/ GET Handle
+ */
+struct TALER_DONAU_ReservesGetHandle;
+
+
+/**
+ * @brief Reserve summary.
+ */
+struct TALER_DONAU_ReserveSummary
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+
+ /**
+ * Reserve balance.
+ */
+ struct TALER_Amount balance;
+
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve status request to a donau.
+ *
+ * @param cls closure
+ * @param rs HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesGetCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReserveSummary *rs);
+
+
+/**
+ * Submit a request to obtain the transaction history of a reserve
+ * from the donau. Note that while we return the full response to the
+ * caller for further processing, we do already verify that the
+ * response is well-formed (i.e. that signatures included in the
+ * response are all valid and add up to the balance). If the donau's
+ * reply is not well-formed, we return an HTTP status code of zero to
+ * @a cb.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param reserve_pub public key of the reserve to inspect
+ * @param timeout how long to wait for an affirmative reply
+ * (enables long polling if the reserve does not yet exist)
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesGetHandle *
+TALER_DONAU_reserves_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_ReservePublicKeyP *reserve_pub,
+ struct GNUNET_TIME_Relative timeout,
+ TALER_DONAU_ReservesGetCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a reserve GET request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param rgh the reserve request handle
+ */
+void
+TALER_DONAU_reserves_get_cancel (
+ struct TALER_DONAU_ReservesGetHandle *rgh);
+
+
+/**
+ * @brief A /reserves/$RID/status Handle
+ */
+struct TALER_DONAU_ReservesStatusHandle;
+
+
+/**
+ * @brief Reserve status details.
+ */
+struct TALER_DONAU_ReserveStatus
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+
+ /**
+ * Current reserve balance. May not be the difference between
+ * @e total_in and @e total_out because the @e may be truncated.
+ */
+ struct TALER_Amount balance;
+
+ /**
+ * Total of all inbound transactions in @e history.
+ */
+ struct TALER_Amount total_in;
+
+ /**
+ * Total of all outbound transactions in @e history.
+ */
+ struct TALER_Amount total_out;
+
+ /**
+ * Reserve history.
+ */
+ const struct TALER_DONAU_ReserveHistoryEntry *history;
+
+ /**
+ * Length of the @e history array.
+ */
+ unsigned int history_len;
+
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve status request to a donau.
+ *
+ * @param cls closure
+ * @param rs HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesStatusCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReserveStatus *rs);
+
+
+/**
+ * Submit a request to obtain the reserve status.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param reserve_priv private key of the reserve to inspect
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesStatusHandle *
+TALER_DONAU_reserves_status (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ TALER_DONAU_ReservesStatusCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a reserve status request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param rsh the reserve request handle
+ */
+void
+TALER_DONAU_reserves_status_cancel (
+ struct TALER_DONAU_ReservesStatusHandle *rsh);
+
+
+/**
+ * @brief A /reserves/$RID/history Handle
+ */
+struct TALER_DONAU_ReservesHistoryHandle;
+
+
+/**
+ * @brief Reserve history details.
+ */
+struct TALER_DONAU_ReserveHistory
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Timestamp of when we made the history request
+ * (client-side).
+ */
+ struct GNUNET_TIME_Timestamp ts;
+
+ /**
+ * Reserve signature affirming the history request
+ * (generated as part of the request).
+ */
+ const struct TALER_ReserveSignatureP *reserve_sig;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+
+ /**
+ * Reserve balance. May not be the difference between
+ * @e total_in and @e total_out because the @e may be truncated
+ * due to expiration.
+ */
+ struct TALER_Amount balance;
+
+ /**
+ * Total of all inbound transactions in @e history.
+ */
+ struct TALER_Amount total_in;
+
+ /**
+ * Total of all outbound transactions in @e history.
+ */
+ struct TALER_Amount total_out;
+
+ /**
+ * Reserve history.
+ */
+ const struct TALER_DONAU_ReserveHistoryEntry *history;
+
+ /**
+ * Length of the @e history array.
+ */
+ unsigned int history_len;
+
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve history request to a donau.
+ *
+ * @param cls closure
+ * @param rs HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesHistoryCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReserveHistory *rs);
+
+
+/**
+ * Submit a request to obtain the reserve history.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param reserve_priv private key of the reserve to inspect
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesHistoryHandle *
+TALER_DONAU_reserves_history (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ TALER_DONAU_ReservesHistoryCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a reserve history request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param rsh the reserve request handle
+ */
+void
+TALER_DONAU_reserves_history_cancel (
+ struct TALER_DONAU_ReservesHistoryHandle *rsh);
+
+
+/* ********************* POST /reserves/$RESERVE_PUB/withdraw *********************** */
+
+
+/**
+ * @brief A /reserves/$RESERVE_PUB/withdraw Handle
+ */
+struct TALER_DONAU_WithdrawHandle;
+
+
+/**
+ * Information input into the withdraw process per coin.
+ */
+struct TALER_DONAU_WithdrawCoinInput
+{
+ /**
+ * Denomination of the coin.
+ */
+ const struct TALER_DONAU_DenomPublicKey *pk;
+
+ /**
+ * Master key material for the coin.
+ */
+ const struct TALER_PlanchetMasterSecretP *ps;
+
+ /**
+ * Age commitment for the coin.
+ */
+ const struct TALER_AgeCommitmentHash *ach;
+
+};
+
+
+/**
+ * All the details about a coin that are generated during withdrawal and that
+ * may be needed for future operations on the coin.
+ */
+struct TALER_DONAU_PrivateCoinDetails
+{
+ /**
+ * Private key of the coin.
+ */
+ struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+ /**
+ * Value used to blind the key for the signature.
+ * Needed for recoup operations.
+ */
+ union TALER_DenominationBlindingKeyP bks;
+
+ /**
+ * Signature over the coin.
+ */
+ struct TALER_DenominationSignature sig;
+
+ /**
+ * Values contributed from the donau during the
+ * withdraw protocol.
+ */
+ struct TALER_ExchangeWithdrawValues donau_vals;
+};
+
+
+/**
+ * Details about a response for a withdraw request.
+ */
+struct TALER_DONAU_WithdrawResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response.
+ */
+ union
+ {
+ /**
+ * Details if the status is #MHD_HTTP_OK.
+ */
+ struct TALER_DONAU_PrivateCoinDetails ok;
+
+ /**
+ * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
+ */
+ struct
+ {
+ /**
+ * Requirement row that the merchant should use
+ * to check for its KYC status.
+ */
+ uint64_t requirement_row;
+
+ /**
+ * Hash of the payto-URI of the account to KYC;
+ */
+ struct TALER_PaytoHashP h_payto;
+
+ } unavailable_for_legal_reasons;
+
+ /**
+ * Details if the status is #MHD_HTTP_CONFLICT.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } conflict;
+
+ /**
+ * Details if the status is #MHD_HTTP_GONE.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } gone;
+
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * withdraw request to a donau.
+ *
+ * @param cls closure
+ * @param wr response details
+ */
+typedef void
+(*TALER_DONAU_WithdrawCallback) (
+ void *cls,
+ const struct TALER_DONAU_WithdrawResponse *wr);
+
+
+/**
+ * Withdraw a coin from the donau using a /reserves/$RESERVE_PUB/withdraw
+ * request. This API is typically used by a wallet to withdraw from a
+ * reserve.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param curl_ctx The curl context to use
+ * @param donau_url The base-URL of the donau
+ * @param keys The /keys material from the donau
+ * @param reserve_priv private key of the reserve to withdraw from
+ * @param wci inputs that determine the planchet
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_WithdrawHandle *
+TALER_DONAU_withdraw (
+ struct GNUNET_CURL_Context *curl_ctx,
+ const char *donau_url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ const struct TALER_DONAU_WithdrawCoinInput *wci,
+ TALER_DONAU_WithdrawCallback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ * Cancel a withdraw status request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param wh the withdraw handle
+ */
+void
+TALER_DONAU_withdraw_cancel (struct TALER_DONAU_WithdrawHandle *wh);
+
+
+/**
+ * @brief A /reserves/$RESERVE_PUB/batch-withdraw Handle
+ */
+struct TALER_DONAU_BatchWithdrawHandle;
+
+
+/**
+ * Details about a response for a batch withdraw request.
+ */
+struct TALER_DONAU_BatchWithdrawResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response.
+ */
+ union
+ {
+ /**
+ * Details if the status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+
+ /**
+ * Array of coins returned by the batch withdraw operation.
+ */
+ struct TALER_DONAU_PrivateCoinDetails *coins;
+
+ /**
+ * Length of the @e coins array.
+ */
+ unsigned int num_coins;
+ } ok;
+
+ /**
+ * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
+ */
+ struct
+ {
+
+ /**
+ * Hash of the payto-URI of the account to KYC;
+ */
+ struct TALER_PaytoHashP h_payto;
+
+ /**
+ * Legitimization requirement that the merchant should use
+ * to check for its KYC status, 0 if not known.
+ */
+ uint64_t requirement_row;
+ } unavailable_for_legal_reasons;
+
+ /**
+ * Details if the status is #MHD_HTTP_CONFLICT.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } conflict;
+
+ /**
+ * Details if the status is #MHD_HTTP_GONE.
+ */
+ struct
+ {
+ /* TODO: returning full details is not implemented */
+ } gone;
+
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * batch withdraw request to a donau.
+ *
+ * @param cls closure
+ * @param wr response details
+ */
+typedef void
+(*TALER_DONAU_BatchWithdrawCallback) (
+ void *cls,
+ const struct TALER_DONAU_BatchWithdrawResponse *wr);
+
+
+/**
+ * Withdraw multiple coins from the donau using a /reserves/$RESERVE_PUB/batch-withdraw
+ * request. This API is typically used by a wallet to withdraw many coins from a
+ * reserve.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param curl_ctx The curl context to use
+ * @param donau_url The base-URL of the donau
+ * @param keys The /keys material from the donau
+ * @param reserve_priv private key of the reserve to withdraw from
+ * @param wci_length number of entries in @a wcis
+ * @param wcis inputs that determine the planchets
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_BatchWithdrawHandle *
+TALER_DONAU_batch_withdraw (
+ struct GNUNET_CURL_Context *curl_ctx,
+ const char *donau_url,
+ const struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ unsigned int wci_length,
+ const struct TALER_DONAU_WithdrawCoinInput wcis[static wci_length],
+ TALER_DONAU_BatchWithdrawCallback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ * Cancel a batch withdraw status request. This function cannot be used on a
+ * request handle if a response is already served for it.
+ *
+ * @param wh the batch withdraw handle
+ */
+void
+TALER_DONAU_batch_withdraw_cancel (
+ struct TALER_DONAU_BatchWithdrawHandle *wh);
+
+
+/**
+ * Response from a withdraw2 request.
+ */
+struct TALER_DONAU_Withdraw2Response
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details if HTTP status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * blind signature over the coin
+ */
+ struct TALER_BlindedDenominationSignature blind_sig;
+ } ok;
+ } details;
+
+};
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * withdraw request to a donau without the (un)blinding factor.
+ *
+ * @param cls closure
+ * @param w2r response data
+ */
+typedef void
+(*TALER_DONAU_Withdraw2Callback) (
+ void *cls,
+ const struct TALER_DONAU_Withdraw2Response *w2r);
+
+
+/**
+ * @brief A /reserves/$RESERVE_PUB/withdraw Handle, 2nd variant.
+ * This variant does not do the blinding/unblinding and only
+ * fetches the blind signature on the already blinded planchet.
+ * Used internally by the `struct TALER_DONAU_WithdrawHandle`
+ * implementation as well as for the tipping logic of merchants.
+ */
+struct TALER_DONAU_Withdraw2Handle;
+
+
+/**
+ * Withdraw a coin from the donau using a /reserves/$RESERVE_PUB/withdraw
+ * request. This API is typically used by a merchant to withdraw a tip
+ * where the blinding factor is unknown to the merchant.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param curl_ctx The curl-context to use
+ * @param donau_url The base-URL of the donau
+ * @param keys The /keys material from the donau
+ * @param pd planchet details of the planchet to withdraw
+ * @param reserve_priv private key of the reserve to withdraw from
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_Withdraw2Handle *
+TALER_DONAU_withdraw2 (
+ struct GNUNET_CURL_Context *curl_ctx,
+ const char *donau_url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_PlanchetDetail *pd,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ TALER_DONAU_Withdraw2Callback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ * Cancel a withdraw status request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param wh the withdraw handle
+ */
+void
+TALER_DONAU_withdraw2_cancel (struct TALER_DONAU_Withdraw2Handle *wh);
+
+
+/**
+ * Response from a batch-withdraw request (2nd variant).
+ */
+struct TALER_DONAU_BatchWithdraw2Response
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details if HTTP status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * array of blind signatures over the coins.
+ */
+ const struct TALER_BlindedDenominationSignature *blind_sigs;
+
+ /**
+ * length of @e blind_sigs
+ */
+ unsigned int blind_sigs_length;
+
+ } ok;
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a batch
+ * withdraw request to a donau without the (un)blinding factor.
+ *
+ * @param cls closure
+ * @param bw2r response data
+ */
+typedef void
+(*TALER_DONAU_BatchWithdraw2Callback) (
+ void *cls,
+ const struct TALER_DONAU_BatchWithdraw2Response *bw2r);
+
+
+/**
+ * @brief A /reserves/$RESERVE_PUB/batch-withdraw Handle, 2nd variant.
+ * This variant does not do the blinding/unblinding and only
+ * fetches the blind signatures on the already blinded planchets.
+ * Used internally by the `struct TALER_DONAU_BatchWithdrawHandle`
+ * implementation as well as for the tipping logic of merchants.
+ */
+struct TALER_DONAU_BatchWithdraw2Handle;
+
+
+/**
+ * Withdraw a coin from the donau using a /reserves/$RESERVE_PUB/batch-withdraw
+ * request. This API is typically used by a merchant to withdraw a tip
+ * where the blinding factor is unknown to the merchant.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param curl_ctx The curl context to use
+ * @param donau_url The base-URL of the donau
+ * @param keys The /keys material from the donau
+ * @param pds array of planchet details of the planchet to withdraw
+ * @param pds_length number of entries in the @a pds array
+ * @param reserve_priv private key of the reserve to withdraw from
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_BatchWithdraw2Handle *
+TALER_DONAU_batch_withdraw2 (
+ struct GNUNET_CURL_Context *curl_ctx,
+ const char *donau_url,
+ const struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ unsigned int pds_length,
+ const struct TALER_PlanchetDetail pds[static pds_length],
+ TALER_DONAU_BatchWithdraw2Callback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ * Cancel a batch withdraw request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param wh the withdraw handle
+ */
+void
+TALER_DONAU_batch_withdraw2_cancel (
+ struct TALER_DONAU_BatchWithdraw2Handle *wh);
+
+
+/* ********************* /reserve/$RESERVE_PUB/age-withdraw *************** */
+
+/**
+ * @brief Information needed to withdraw (and reveal) age restricted coins.
+ */
+struct TALER_DONAU_AgeWithdrawCoinInput
+{
+ /**
+ * The master secret from which we derive all other relevant values for
+ * the coin: private key, nonces (if applicable) and age restriction
+ */
+ struct TALER_PlanchetMasterSecretP secrets[TALER_CNC_KAPPA];
+
+ /**
+ * The denomination of the coin. Must support age restriction, i.e
+ * its .keys.age_mask MUST not be 0
+ */
+ struct TALER_DONAU_DenomPublicKey *denom_pub;
+};
+
+
+/**
+ * All the details about a coin that are generated during age-withdrawal and
+ * that may be needed for future operations on the coin.
+ */
+struct TALER_DONAU_AgeWithdrawCoinPrivateDetails
+{
+ /**
+ * Private key of the coin.
+ */
+ struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+ /**
+ * Hash of the public key of the coin.
+ */
+ struct TALER_CoinPubHashP h_coin_pub;
+
+ /**
+ * Value used to blind the key for the signature.
+ * Needed for recoup operations.
+ */
+ union TALER_DenominationBlindingKeyP blinding_key;
+
+ /**
+ * The age commitment, proof for the coin, derived from the
+ * Master secret and maximum age in the originating request
+ */
+ struct TALER_AgeCommitmentProof age_commitment_proof;
+
+ /**
+ * The hash of the age commitment
+ */
+ struct TALER_AgeCommitmentHash h_age_commitment;
+
+ /**
+ * Values contributed from the donau during the
+ * withdraw protocol.
+ */
+ struct TALER_ExchangeWithdrawValues alg_values;
+
+ /**
+ * The planchet constructed
+ */
+ struct TALER_PlanchetDetail planchet;
+};
+
+/**
+ * @brief A handle to a /reserves/$RESERVE_PUB/age-withdraw request
+ */
+struct TALER_DONAU_AgeWithdrawHandle;
+
+/**
+ * @brief Details about the response for a age withdraw request.
+ */
+struct TALER_DONAU_AgeWithdrawResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response
+ */
+ union
+ {
+ /**
+ * Details if the status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Index that should not be revealed during the age-withdraw reveal
+ * phase.
+ */
+ uint8_t noreveal_index;
+
+ /**
+ * The commitment of the age-withdraw request, needed for the
+ * subsequent call to /age-withdraw/$ACH/reveal
+ */
+ struct TALER_AgeWithdrawCommitmentHashP h_commitment;
+
+ /**
+ * The number of elements in @e coins, each referring to
+ * TALER_CNC_KAPPA elements
+ */
+ size_t num_coins;
+
+ /**
+ * The computed details of the non-revealed @e num_coins coins to keep.
+ */
+ const struct TALER_DONAU_AgeWithdrawCoinPrivateDetails *coin_details;
+
+ /**
+ * The array of blinded hashes of the non-revealed
+ * @e num_coins coins, needed for the reveal step;
+ */
+ const struct TALER_BlindedCoinHashP *blinded_coin_hs;
+
+ /**
+ * Key used by the donau to sign the response.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+ } ok;
+ } details;
+};
+
+typedef void
+(*TALER_DONAU_AgeWithdrawCallback)(
+ void *cls,
+ const struct TALER_DONAU_AgeWithdrawResponse *awr);
+
+/**
+ * Submit an age-withdraw request to the donau and get the donau's
+ * response.
+ *
+ * This API is typically used by a wallet. Note that to ensure that
+ * no money is lost in case of hardware failures, the provided
+ * argument @a rd should be committed to persistent storage
+ * prior to calling this function.
+ *
+ * @param curl_ctx The curl context
+ * @param donau_url The base url of the donau
+ * @param keys The denomination keys from the donau
+ * @param reserve_priv The pivate key to the reserve
+ * @param num_coins The number of elements in @e coin_inputs
+ * @param coin_inputs The input for the coins to withdraw
+ * @param max_age The maximum age we commit to.
+ * @param res_cb A callback for the result, maybe NULL
+ * @param res_cb_cls A closure for @e res_cb, maybe NULL
+ * @return a handle for this request; NULL if the argument was invalid.
+ * In this case, the callback will not be called.
+ */
+struct TALER_DONAU_AgeWithdrawHandle *
+TALER_DONAU_age_withdraw (
+ struct GNUNET_CURL_Context *curl_ctx,
+ struct TALER_DONAU_Keys *keys,
+ const char *donau_url,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ size_t num_coins,
+ const struct TALER_DONAU_AgeWithdrawCoinInput coin_inputs[static
+ num_coins],
+ uint8_t max_age,
+ TALER_DONAU_AgeWithdrawCallback res_cb,
+ void *res_cb_cls);
+
+/**
+ * Cancel a age-withdraw request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param awh the age-withdraw handle
+ */
+void
+TALER_DONAU_age_withdraw_cancel (
+ struct TALER_DONAU_AgeWithdrawHandle *awh);
+
+
+/**++++++ age-withdraw with pre-blinded planchets ***************************/
+
+/**
+ * @brief Information needed to withdraw (and reveal) age restricted coins.
+ */
+struct TALER_DONAU_AgeWithdrawBlindedInput
+{
+ /**
+ * The denomination of the coin. Must support age restriction, i.e
+ * its .keys.age_mask MUST not be 0
+ */
+ const struct TALER_DONAU_DenomPublicKey *denom_pub;
+
+ /**
+ * Blinded Planchets
+ */
+ struct TALER_PlanchetDetail planchet_details[TALER_CNC_KAPPA];
+};
+
+/**
+ * Response from an age-withdraw request with pre-blinded planchets
+ */
+struct TALER_DONAU_AgeWithdrawBlindedResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details if HTTP status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Index that should not be revealed during the age-withdraw reveal phase.
+ * The struct TALER_PlanchetMasterSecretP * from the request
+ * with this index are the ones to keep.
+ */
+ uint8_t noreveal_index;
+
+ /**
+ * The commitment of the call to age-withdraw, needed for the subsequent
+ * call to /age-withdraw/$ACH/reveal.
+ */
+ struct TALER_AgeWithdrawCommitmentHashP h_commitment;
+
+ /**
+ * Key used by the donau to sign the response.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ } ok;
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting an
+ * age-withdraw request to a donau with pre-blinded planchets
+ * without the (un)blinding factor.
+ *
+ * @param cls closure
+ * @param awbr response data
+ */
+typedef void
+(*TALER_DONAU_AgeWithdrawBlindedCallback) (
+ void *cls,
+ const struct TALER_DONAU_AgeWithdrawBlindedResponse *awbr);
+
+
+/**
+ * @brief A /reserves/$RESERVE_PUB/age-withdraw Handle, 2nd variant with
+ * pre-blinded planchets.
+ *
+ * This variant does not do the blinding/unblinding and only
+ * fetches the blind signatures on the already blinded planchets.
+ * Used internally by the `struct TALER_DONAU_BatchWithdrawHandle`
+ * implementation as well as for the reward logic of merchants.
+ */
+struct TALER_DONAU_AgeWithdrawBlindedHandle;
+
+/**
+ * Withdraw age-restricted coins from the donau using a
+ * /reserves/$RESERVE_PUB/age-withdraw request. This API is typically used
+ * by a merchant to withdraw a reward where the planchets are pre-blinded and
+ * the blinding factor is unknown to the merchant.
+ *
+ * Note that to ensure that no money is lost in case of hardware
+ * failures, the caller must have committed (most of) the arguments to
+ * disk before calling, and be ready to repeat the request with the
+ * same arguments in case of failures.
+ *
+ * @param curl_ctx The curl context to use
+ * @param donau_url The base-URL of the donau
+ * @param keys The /keys material from the donau
+ * @param max_age The maximum age that the coins are committed to.
+ * @param num_input number of entries in the @a blinded_input array
+ * @param blinded_input array of planchet details of the planchet to withdraw
+ * @param reserve_priv private key of the reserve to withdraw from
+ * @param res_cb the callback to call when the final result for this request is available
+ * @param res_cb_cls closure for @a res_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_AgeWithdrawBlindedHandle *
+TALER_DONAU_age_withdraw_blinded (
+ struct GNUNET_CURL_Context *curl_ctx,
+ struct TALER_DONAU_Keys *keys,
+ const char *donau_url,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ uint8_t max_age,
+ unsigned int num_input,
+ const struct TALER_DONAU_AgeWithdrawBlindedInput blinded_input[static
+ num_input],
+ TALER_DONAU_AgeWithdrawBlindedCallback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ * Cancel an age-withdraw request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param awbh the age-withdraw handle
+ */
+void
+TALER_DONAU_age_withdraw_blinded_cancel (
+ struct TALER_DONAU_AgeWithdrawBlindedHandle *awbh);
+
+
+/* ********************* /age-withdraw/$ACH/reveal ************************ */
+
+/**
+ * @brief A handle to a /age-withdraw/$ACH/reveal request
+ */
+struct TALER_DONAU_AgeWithdrawRevealHandle;
+
+/**
+ * The response from a /age-withdraw/$ACH/reveal request
+ */
+struct TALER_DONAU_AgeWithdrawRevealResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response
+ */
+ union
+ {
+ /**
+ * Details if the status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Number of signatures returned.
+ */
+ unsigned int num_sigs;
+
+ /**
+ * Array of @e num_coins blinded denomination signatures, giving each
+ * coin its value and validity. The array give these coins in the same
+ * order (and should have the same length) in which the original
+ * age-withdraw request specified the respective denomination keys.
+ */
+ const struct TALER_BlindedDenominationSignature *blinded_denom_sigs;
+
+ } ok;
+ } details;
+
+};
+
+typedef void
+(*TALER_DONAU_AgeWithdrawRevealCallback)(
+ void *cls,
+ const struct TALER_DONAU_AgeWithdrawRevealResponse *awr);
+
+/**
+ * Submit an age-withdraw-reveal request to the donau and get the donau's
+ * response.
+ *
+ * This API is typically used by a wallet. Note that to ensure that
+ * no money is lost in case of hardware failures, the provided
+ * argument @a rd should be committed to persistent storage
+ * prior to calling this function.
+ *
+ * @param curl_ctx The curl context
+ * @param donau_url The base url of the donau
+ * @param num_coins The number of elements in @e coin_inputs and @e alg_values
+ * @param coin_inputs The input for the coins to withdraw, same as in the previous call to /age-withdraw
+ * @param noreveal_index The index into each of the kappa coin candidates, that should not be revealed to the donau
+ * @param h_commitment The commmitment from the previous call to /age-withdraw
+ * @param reserve_pub The public key of the reserve the original call to /age-withdraw was made to
+ * @param res_cb A callback for the result, maybe NULL
+ * @param res_cb_cls A closure for @e res_cb, maybe NULL
+ * @return a handle for this request; NULL if the argument was invalid.
+ * In this case, the callback will not be called.
+ */
+struct TALER_DONAU_AgeWithdrawRevealHandle *
+TALER_DONAU_age_withdraw_reveal (
+ struct GNUNET_CURL_Context *curl_ctx,
+ const char *donau_url,
+ size_t num_coins,
+ const struct TALER_DONAU_AgeWithdrawCoinInput coin_inputs[static
+ num_coins],
+ uint8_t noreveal_index,
+ const struct TALER_AgeWithdrawCommitmentHashP *h_commitment,
+ const struct TALER_ReservePublicKeyP *reserve_pub,
+ TALER_DONAU_AgeWithdrawRevealCallback res_cb,
+ void *res_cb_cls);
+
+
+/**
+ * @brief Cancel an age-withdraw-reveal request
+ *
+ * @param awrh Handle to an age-withdraw-reqveal request
+ */
+void
+TALER_DONAU_age_withdraw_reveal_cancel (
+ struct TALER_DONAU_AgeWithdrawRevealHandle *awrh);
+
+
+/* ********************* /refresh/melt+reveal ***************************** */
+
+
+/**
+ * Information needed to melt (partially spent) coins to obtain fresh coins
+ * that are unlinkable to the original coin(s). Note that melting more than
+ * one coin in a single request will make those coins linkable, so we only melt
+ * one coin at a time.
+ */
+struct TALER_DONAU_RefreshData
+{
+ /**
+ * private key of the coin to melt
+ */
+ struct TALER_CoinSpendPrivateKeyP melt_priv;
+
+ /*
+ * age commitment and proof and its hash that went into the original coin,
+ * might be NULL.
+ */
+ const struct TALER_AgeCommitmentProof *melt_age_commitment_proof;
+ const struct TALER_AgeCommitmentHash *melt_h_age_commitment;
+
+ /**
+ * amount specifying how much the coin will contribute to the melt
+ * (including fee)
+ */
+ struct TALER_Amount melt_amount;
+
+ /**
+ * signatures affirming the validity of the public keys corresponding to the
+ * @e melt_priv private key
+ */
+ struct TALER_DenominationSignature melt_sig;
+
+ /**
+ * denomination key information record corresponding to the @e melt_sig
+ * validity of the keys
+ */
+ struct TALER_DONAU_DenomPublicKey melt_pk;
+
+ /**
+ * array of @e pks_len denominations of fresh coins to create
+ */
+ const struct TALER_DONAU_DenomPublicKey *fresh_pks;
+
+ /**
+ * length of the @e pks array
+ */
+ unsigned int fresh_pks_len;
+};
+
+
+/* ********************* /coins/$COIN_PUB/melt ***************************** */
+
+/**
+ * @brief A /coins/$COIN_PUB/melt Handle
+ */
+struct TALER_DONAU_MeltHandle;
+
+
+/**
+ * Information we obtain per coin during melting.
+ */
+struct TALER_DONAU_MeltBlindingDetail
+{
+ /**
+ * Exchange values contributed to the refresh operation
+ */
+ struct TALER_ExchangeWithdrawValues alg_value;
+
+};
+
+
+/**
+ * Response returned to a /melt request.
+ */
+struct TALER_DONAU_MeltResponse
+{
+ /**
+ * Full HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Parsed response details, variant depending on the
+ * @e hr.http_status.
+ */
+ union
+ {
+ /**
+ * Results for status #MHD_HTTP_OK.
+ */
+ struct
+ {
+
+ /**
+ * Information returned per coin.
+ */
+ const struct TALER_DONAU_MeltBlindingDetail *mbds;
+
+ /**
+ * Key used by the donau to sign the response.
+ */
+ struct TALER_ExchangePublicKeyP sign_key;
+
+ /**
+ * Length of the @a mbds array with the donau values
+ * and blinding keys we are using.
+ */
+ unsigned int num_mbds;
+
+ /**
+ * Gamma value chosen by the donau.
+ */
+ uint32_t noreveal_index;
+ } ok;
+
+ } details;
+};
+
+
+/**
+ * Callbacks of this type are used to notify the application about the result
+ * of the /coins/$COIN_PUB/melt stage. If successful, the @a noreveal_index
+ * should be committed to disk prior to proceeding
+ * #TALER_DONAU_refreshes_reveal().
+ *
+ * @param cls closure
+ * @param mr response details
+ */
+typedef void
+(*TALER_DONAU_MeltCallback) (
+ void *cls,
+ const struct TALER_DONAU_MeltResponse *mr);
+
+
+/**
+ * Submit a melt request to the donau and get the donau's
+ * response.
+ *
+ * This API is typically used by a wallet. Note that to ensure that
+ * no money is lost in case of hardware failures, the provided
+ * argument @a rd should be committed to persistent storage
+ * prior to calling this function.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param rms the fresh secret that defines the refresh operation
+ * @param rd the refresh data specifying the characteristics of the operation
+ * @param melt_cb the callback to call with the result
+ * @param melt_cb_cls closure for @a melt_cb
+ * @return a handle for this request; NULL if the argument was invalid.
+ * In this case, neither callback will be called.
+ */
+struct TALER_DONAU_MeltHandle *
+TALER_DONAU_melt (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_RefreshMasterSecretP *rms,
+ const struct TALER_DONAU_RefreshData *rd,
+ TALER_DONAU_MeltCallback melt_cb,
+ void *melt_cb_cls);
+
+
+/**
+ * Cancel a melt request. This function cannot be used
+ * on a request handle if the callback was already invoked.
+ *
+ * @param mh the melt handle
+ */
+void
+TALER_DONAU_melt_cancel (struct TALER_DONAU_MeltHandle *mh);
+
+
+/* ********************* /refreshes/$RCH/reveal ***************************** */
+
+
+/**
+ * Information about a coin obtained via /refreshes/$RCH/reveal.
+ */
+struct TALER_DONAU_RevealedCoinInfo
+{
+ /**
+ * Private key of the coin.
+ */
+ struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+ /**
+ * Master secret of this coin.
+ */
+ struct TALER_PlanchetMasterSecretP ps;
+
+ /**
+ * Age commitment and its hash of the coin, might be NULL.
+ */
+ struct TALER_AgeCommitmentProof *age_commitment_proof;
+ struct TALER_AgeCommitmentHash h_age_commitment;
+
+ /**
+ * Blinding keys used to blind the fresh coin.
+ */
+ union TALER_DenominationBlindingKeyP bks;
+
+ /**
+ * Signature affirming the validity of the coin.
+ */
+ struct TALER_DenominationSignature sig;
+
+};
+
+
+/**
+ * Result of a /refreshes/$RCH/reveal request.
+ */
+struct TALER_DONAU_RevealResult
+{
+ /**
+ * HTTP status.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Parsed response details, variant depending on the
+ * @e hr.http_status.
+ */
+ union
+ {
+ /**
+ * Results for status #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Array of @e num_coins values about the coins obtained via the refresh
+ * operation. The array give the coins in the same order (and should
+ * have the same length) in which the original melt request specified the
+ * respective denomination keys.
+ */
+ const struct TALER_DONAU_RevealedCoinInfo *coins;
+
+ /**
+ * Number of coins returned.
+ */
+ unsigned int num_coins;
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to return the final result of
+ * submitting a refresh request to a donau. If the operation was
+ * successful, this function returns the signatures over the coins
+ * that were remelted.
+ *
+ * @param cls closure
+ * @param rr result of the reveal operation
+ */
+typedef void
+(*TALER_DONAU_RefreshesRevealCallback)(
+ void *cls,
+ const struct TALER_DONAU_RevealResult *rr);
+
+
+/**
+ * @brief A /refreshes/$RCH/reveal Handle
+ */
+struct TALER_DONAU_RefreshesRevealHandle;
+
+
+/**
+ * Submit a /refreshes/$RCH/reval request to the donau and get the donau's
+ * response.
+ *
+ * This API is typically used by a wallet. Note that to ensure that
+ * no money is lost in case of hardware failures, the provided
+ * arguments should have been committed to persistent storage
+ * prior to calling this function.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param rms the fresh secret that defines the refresh operation
+ * @param rd the refresh data that characterizes the refresh operation
+ * @param num_coins number of fresh coins to be created, length of the @a donau_vals array, must match value in @a rd
+ * @param alg_values array @a num_coins of donau values contributed to the refresh operation
+ * @param noreveal_index response from the donau to the
+ * #TALER_DONAU_melt() invocation
+ * @param reveal_cb the callback to call with the final result of the
+ * refresh operation
+ * @param reveal_cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the argument was invalid.
+ * In this case, neither callback will be called.
+ */
+struct TALER_DONAU_RefreshesRevealHandle *
+TALER_DONAU_refreshes_reveal (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_RefreshMasterSecretP *rms,
+ const struct TALER_DONAU_RefreshData *rd,
+ unsigned int num_coins,
+ const struct TALER_ExchangeWithdrawValues alg_values[static num_coins],
+ uint32_t noreveal_index,
+ TALER_DONAU_RefreshesRevealCallback reveal_cb,
+ void *reveal_cb_cls);
+
+
+/**
+ * Cancel a refresh reveal request. This function cannot be used
+ * on a request handle if the callback was already invoked.
+ *
+ * @param rrh the refresh reval handle
+ */
+void
+TALER_DONAU_refreshes_reveal_cancel (
+ struct TALER_DONAU_RefreshesRevealHandle *rrh);
+
+
+/* ********************* /coins/$COIN_PUB/link ***************************** */
+
+
+/**
+ * @brief A /coins/$COIN_PUB/link Handle
+ */
+struct TALER_DONAU_LinkHandle;
+
+
+/**
+ * Information about a coin obtained via /link.
+ */
+struct TALER_DONAU_LinkedCoinInfo
+{
+ /**
+ * Private key of the coin.
+ */
+ struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+ /**
+ * Age commitment and its hash, if applicable.
+ */
+ bool has_age_commitment;
+ struct TALER_AgeCommitmentProof age_commitment_proof;
+ struct TALER_AgeCommitmentHash h_age_commitment;
+
+ /**
+ * Master secret of this coin.
+ */
+ struct TALER_PlanchetMasterSecretP ps;
+
+ /**
+ * Signature affirming the validity of the coin.
+ */
+ struct TALER_DenominationSignature sig;
+
+ /**
+ * Denomination public key of the coin.
+ */
+ struct TALER_DenominationPublicKey pub;
+};
+
+
+/**
+ * Result of a /link request.
+ */
+struct TALER_DONAU_LinkResult
+{
+ /**
+ * HTTP status.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Parsed response details, variant depending on the
+ * @e hr.http_status.
+ */
+ union
+ {
+ /**
+ * Results for status #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Array of @e num_coins values about the
+ * coins obtained via linkage.
+ */
+ const struct TALER_DONAU_LinkedCoinInfo *coins;
+
+ /**
+ * Number of coins returned.
+ */
+ unsigned int num_coins;
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to return the final result of submitting a
+ * /coins/$COIN_PUB/link request to a donau. If the operation was
+ * successful, this function returns the signatures over the coins that were
+ * created when the original coin was melted.
+ *
+ * @param cls closure
+ * @param lr result of the /link operation
+ */
+typedef void
+(*TALER_DONAU_LinkCallback) (
+ void *cls,
+ const struct TALER_DONAU_LinkResult *lr);
+
+
+/**
+ * Submit a link request to the donau and get the donau's response.
+ *
+ * This API is typically not used by anyone, it is more a threat against those
+ * trying to receive a funds transfer by abusing the refresh protocol.
+ *
+ * @param ctx CURL context
+ * @param url donau base URL
+ * @param coin_priv private key to request link data for
+ * @param age_commitment_proof age commitment to the corresponding coin, might be NULL
+ * @param link_cb the callback to call with the useful result of the
+ * refresh operation the @a coin_priv was involved in (if any)
+ * @param link_cb_cls closure for @a link_cb
+ * @return a handle for this request
+ */
+struct TALER_DONAU_LinkHandle *
+TALER_DONAU_link (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_CoinSpendPrivateKeyP *coin_priv,
+ const struct TALER_AgeCommitmentProof *age_commitment_proof,
+ TALER_DONAU_LinkCallback link_cb,
+ void *link_cb_cls);
+
+
+/**
+ * Cancel a link request. This function cannot be used
+ * on a request handle if the callback was already invoked.
+ *
+ * @param lh the link handle
+ */
+void
+TALER_DONAU_link_cancel (struct TALER_DONAU_LinkHandle *lh);
+
+
+/* ********************* /transfers/$WTID *********************** */
+
+/**
+ * @brief A /transfers/$WTID Handle
+ */
+struct TALER_DONAU_TransfersGetHandle;
+
+
+/**
+ * Information the donau returns per wire transfer.
+ */
+struct TALER_DONAU_TransferData
+{
+
+ /**
+ * donau key used to sign
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * donau signature over the transfer data
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+ /**
+ * hash of the payto:// URI the transfer went to
+ */
+ struct TALER_PaytoHashP h_payto;
+
+ /**
+ * time when the donau claims to have performed the wire transfer
+ */
+ struct GNUNET_TIME_Timestamp execution_time;
+
+ /**
+ * Actual amount of the wire transfer, excluding the wire fee.
+ */
+ struct TALER_Amount total_amount;
+
+ /**
+ * wire fee that was charged by the donau
+ */
+ struct TALER_Amount wire_fee;
+
+ /**
+ * length of the @e details array
+ */
+ unsigned int details_length;
+
+ /**
+ * array with details about the combined transactions
+ */
+ const struct TALER_TrackTransferDetails *details;
+
+};
+
+
+/**
+ * Response for a GET /transfers request.
+ */
+struct TALER_DONAU_TransfersGetResponse
+{
+ /**
+ * HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on HTTP status code.
+ */
+ union
+ {
+ /**
+ * Details if status code is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ struct TALER_DONAU_TransferData td;
+ } ok;
+
+ } details;
+};
+
+
+/**
+ * Function called with detailed wire transfer data, including all
+ * of the coin transactions that were combined into the wire transfer.
+ *
+ * @param cls closure
+ * @param tgr response data
+ */
+typedef void
+(*TALER_DONAU_TransfersGetCallback)(
+ void *cls,
+ const struct TALER_DONAU_TransfersGetResponse *tgr);
+
+
+/**
+ * Query the donau about which transactions were combined
+ * to create a wire transfer.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param wtid raw wire transfer identifier to get information about
+ * @param cb callback to call
+ * @param cb_cls closure for @a cb
+ * @return handle to cancel operation
+ */
+struct TALER_DONAU_TransfersGetHandle *
+TALER_DONAU_transfers_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_WireTransferIdentifierRawP *wtid,
+ TALER_DONAU_TransfersGetCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel wire deposits request. This function cannot be used on a request
+ * handle if a response is already served for it.
+ *
+ * @param wdh the wire deposits request handle
+ */
+void
+TALER_DONAU_transfers_get_cancel (
+ struct TALER_DONAU_TransfersGetHandle *wdh);
+
+
+/* ********************* GET /deposits/ *********************** */
+
+
+/**
+ * @brief A /deposits/ GET Handle
+ */
+struct TALER_DONAU_DepositGetHandle;
+
+
+/**
+ * Data returned for a successful GET /deposits/ request.
+ */
+struct TALER_DONAU_GetDepositResponse
+{
+
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details about the response.
+ */
+ union
+ {
+
+ /**
+ * Response if the status was #MHD_HTTP_OK
+ */
+ struct TALER_DONAU_DepositData
+ {
+ /**
+ * donau key used to sign, all zeros if donau did not
+ * yet execute the transaction
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * signature from the donau over the deposit data, all zeros if donau did not
+ * yet execute the transaction
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+ /**
+ * wire transfer identifier used by the donau, all zeros if donau did not
+ * yet execute the transaction
+ */
+ struct TALER_WireTransferIdentifierRawP wtid;
+
+ /**
+ * actual execution time for the wire transfer
+ */
+ struct GNUNET_TIME_Timestamp execution_time;
+
+ /**
+ * contribution to the total amount by this coin, all zeros if donau did not
+ * yet execute the transaction
+ */
+ struct TALER_Amount coin_contribution;
+
+ } ok;
+
+ /**
+ * Response if the status was #MHD_HTTP_ACCEPTED
+ */
+ struct
+ {
+
+ /**
+ * planned execution time for the wire transfer
+ */
+ struct GNUNET_TIME_Timestamp execution_time;
+
+ /**
+ * KYC legitimization requirement that the merchant should use to check
+ * for its KYC status.
+ */
+ uint64_t requirement_row;
+
+ /**
+ * Current AML state for the account. May explain why transfers are
+ * not happening.
+ */
+ enum TALER_AmlDecisionState aml_decision;
+
+ /**
+ * Set to 'true' if the KYC check is already finished and
+ * the donau is merely waiting for the @e execution_time.
+ */
+ bool kyc_ok;
+ } accepted;
+
+ } details;
+};
+
+
+/**
+ * Function called with detailed wire transfer data.
+ *
+ * @param cls closure
+ * @param dr details about the deposit response
+ */
+typedef void
+(*TALER_DONAU_DepositGetCallback)(
+ void *cls,
+ const struct TALER_DONAU_GetDepositResponse *dr);
+
+
+/**
+ * Obtain the wire transfer details for a given transaction. Tells the client
+ * which aggregate wire transfer the deposit operation identified by @a coin_pub,
+ * @a merchant_priv and @a h_contract_terms contributed to.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param merchant_priv the merchant's private key
+ * @param h_wire hash of merchant's wire transfer details
+ * @param h_contract_terms hash of the proposal data
+ * @param coin_pub public key of the coin
+ * @param timeout timeout to use for long-polling, 0 for no long polling
+ * @param cb function to call with the result
+ * @param cb_cls closure for @a cb
+ * @return handle to abort request
+ */
+struct TALER_DONAU_DepositGetHandle *
+TALER_DONAU_deposits_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_MerchantPrivateKeyP *merchant_priv,
+ const struct TALER_MerchantWireHashP *h_wire,
+ const struct TALER_PrivateContractHashP *h_contract_terms,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ struct GNUNET_TIME_Relative timeout,
+ TALER_DONAU_DepositGetCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel deposit wtid request. This function cannot be used on a request
+ * handle if a response is already served for it.
+ *
+ * @param dwh the wire deposits request handle
+ */
+void
+TALER_DONAU_deposits_get_cancel (
+ struct TALER_DONAU_DepositGetHandle *dwh);
+
+
+/**
+ * Convenience function. Verifies a coin's transaction history as
+ * returned by the donau.
+ *
+ * @param dk fee structure for the coin
+ * @param coin_pub public key of the coin
+ * @param history history of the coin in json encoding
+ * @param[out] total how much of the coin has been spent according to @a history
+ * @return #GNUNET_OK if @a history is valid, #GNUNET_SYSERR if not
+ */
+enum GNUNET_GenericReturnValue
+TALER_DONAU_verify_coin_history (
+ const struct TALER_DONAU_DenomPublicKey *dk,
+ const struct TALER_CoinSpendPublicKeyP *coin_pub,
+ const json_t *history,
+ struct TALER_Amount *total);
+
+
+/**
+ * Parse history given in JSON format and return it in binary
+ * format.
+ *
+ * @param keys donau keys
+ * @param history JSON array with the history
+ * @param reserve_pub public key of the reserve to inspect
+ * @param currency currency we expect the balance to be in
+ * @param[out] total_in set to value of credits to reserve
+ * @param[out] total_out set to value of debits from reserve
+ * @param history_length number of entries in @a history
+ * @param[out] rhistory array of length @a history_length, set to the
+ * parsed history entries
+ * @return #GNUNET_OK if history was valid and @a rhistory and @a balance
+ * were set,
+ * #GNUNET_SYSERR if there was a protocol violation in @a history
+ */
+enum GNUNET_GenericReturnValue
+TALER_DONAU_parse_reserve_history (
+ const struct TALER_DONAU_Keys *keys,
+ const json_t *history,
+ const struct TALER_ReservePublicKeyP *reserve_pub,
+ const char *currency,
+ struct TALER_Amount *total_in,
+ struct TALER_Amount *total_out,
+ unsigned int history_length,
+ struct TALER_DONAU_ReserveHistoryEntry rhistory[static history_length]);
+
+
+/**
+ * Free memory (potentially) allocated by #TALER_DONAU_parse_reserve_history().
+ *
+ * @param len number of entries in @a rhistory
+ * @param[in] rhistory result to free
+ */
+void
+TALER_DONAU_free_reserve_history (
+ unsigned int len,
+ struct TALER_DONAU_ReserveHistoryEntry rhistory[static len]);
+
+
+/* ********************* /recoup *********************** */
+
+
+/**
+ * @brief A /recoup Handle
+ */
+struct TALER_DONAU_RecoupHandle;
+
+
+/**
+ * Response from a recoup request.
+ */
+struct TALER_DONAU_RecoupResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details if HTTP status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * public key of the reserve receiving the recoup
+ */
+ struct TALER_ReservePublicKeyP reserve_pub;
+
+ } ok;
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to return the final result of
+ * submitting a recoup request to a donau. If the operation was
+ * successful, this function returns the @a reserve_pub of the
+ * reserve that was credited.
+ *
+ * @param cls closure
+ * @param rr response data
+ */
+typedef void
+(*TALER_DONAU_RecoupResultCallback) (
+ void *cls,
+ const struct TALER_DONAU_RecoupResponse *rr);
+
+
+/**
+ * Ask the donau to pay back a coin due to the donau triggering
+ * the emergency recoup protocol for a given denomination. The value
+ * of the coin will be refunded to the original customer (without fees).
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param pk kind of coin to pay back
+ * @param denom_sig signature over the coin by the donau using @a pk
+ * @param donau_vals contribution from the donau on the withdraw
+ * @param ps secret internals of the original planchet
+ * @param recoup_cb the callback to call when the final result for this request is available
+ * @param recoup_cb_cls closure for @a recoup_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_RecoupHandle *
+TALER_DONAU_recoup (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_DONAU_DenomPublicKey *pk,
+ const struct TALER_DenominationSignature *denom_sig,
+ const struct TALER_ExchangeWithdrawValues *donau_vals,
+ const struct TALER_PlanchetMasterSecretP *ps,
+ TALER_DONAU_RecoupResultCallback recoup_cb,
+ void *recoup_cb_cls);
+
+
+/**
+ * Cancel a recoup request. This function cannot be used on a
+ * request handle if the callback was already invoked.
+ *
+ * @param ph the recoup handle
+ */
+void
+TALER_DONAU_recoup_cancel (struct TALER_DONAU_RecoupHandle *ph);
+
+
+/* ********************* /recoup-refresh *********************** */
+
+
+/**
+ * @brief A /recoup-refresh Handle
+ */
+struct TALER_DONAU_RecoupRefreshHandle;
+
+
+/**
+ * Response from a /recoup-refresh request.
+ */
+struct TALER_DONAU_RecoupRefreshResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details if HTTP status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * public key of the dirty coin that was credited
+ */
+ struct TALER_CoinSpendPublicKeyP old_coin_pub;
+
+ } ok;
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to return the final result of
+ * submitting a recoup-refresh request to a donau.
+ *
+ * @param cls closure
+ * @param rrr response data
+ */
+typedef void
+(*TALER_DONAU_RecoupRefreshResultCallback) (
+ void *cls,
+ const struct TALER_DONAU_RecoupRefreshResponse *rrr);
+
+
+/**
+ * Ask the donau to pay back a coin due to the donau triggering
+ * the emergency recoup protocol for a given denomination. The value
+ * of the coin will be refunded to the original coin that the
+ * revoked coin was refreshed from. The original coin is then
+ * considered a zombie.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param pk kind of coin to pay back
+ * @param denom_sig signature over the coin by the donau using @a pk
+ * @param donau_vals contribution from the donau on the withdraw
+ * @param rms melt secret of the refreshing operation
+ * @param ps coin-specific secrets derived for this coin during the refreshing operation
+ * @param idx index of the fresh coin in the refresh operation that is now being recouped
+ * @param recoup_cb the callback to call when the final result for this request is available
+ * @param recoup_cb_cls closure for @a recoup_cb
+ * @return NULL
+ * if the inputs are invalid (i.e. denomination key not with this donau).
+ * In this case, the callback is not called.
+ */
+struct TALER_DONAU_RecoupRefreshHandle *
+TALER_DONAU_recoup_refresh (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_DONAU_DenomPublicKey *pk,
+ const struct TALER_DenominationSignature *denom_sig,
+ const struct TALER_ExchangeWithdrawValues *donau_vals,
+ const struct TALER_RefreshMasterSecretP *rms,
+ const struct TALER_PlanchetMasterSecretP *ps,
+ unsigned int idx,
+ TALER_DONAU_RecoupRefreshResultCallback recoup_cb,
+ void *recoup_cb_cls);
+
+
+/**
+ * Cancel a recoup-refresh request. This function cannot be used on a request
+ * handle if the callback was already invoked.
+ *
+ * @param ph the recoup handle
+ */
+void
+TALER_DONAU_recoup_refresh_cancel (
+ struct TALER_DONAU_RecoupRefreshHandle *ph);
+
+struct TALER_DONAU_KycProofHandle;
+
+/* ********************* /management *********************** */
+
+
+/**
+ * @brief Future Exchange's signature key
+ */
+struct TALER_DONAU_FutureSigningPublicKey
+{
+ /**
+ * The signing public key
+ */
+ struct TALER_ExchangePublicKeyP key;
+
+ /**
+ * Signature by the security module affirming it owns this key.
+ */
+ struct TALER_SecurityModuleSignatureP signkey_secmod_sig;
+
+ /**
+ * Validity start time
+ */
+ struct GNUNET_TIME_Timestamp valid_from;
+
+ /**
+ * Validity expiration time (how long the donau may use it).
+ */
+ struct GNUNET_TIME_Timestamp valid_until;
+
+ /**
+ * Validity expiration time for legal disputes.
+ */
+ struct GNUNET_TIME_Timestamp valid_legal;
+};
+
+
+/**
+ * @brief Public information about a future donau's denomination key
+ */
+struct TALER_DONAU_FutureDenomPublicKey
+{
+ /**
+ * The public key
+ */
+ struct TALER_DenominationPublicKey key;
+
+ /**
+ * Signature by the security module affirming it owns this key.
+ */
+ struct TALER_SecurityModuleSignatureP denom_secmod_sig;
+
+ /**
+ * Timestamp indicating when the denomination key becomes valid
+ */
+ struct GNUNET_TIME_Timestamp valid_from;
+
+ /**
+ * Timestamp indicating when the denomination key can’t be used anymore to
+ * withdraw new coins.
+ */
+ struct GNUNET_TIME_Timestamp withdraw_valid_until;
+
+ /**
+ * Timestamp indicating when coins of this denomination become invalid.
+ */
+ struct GNUNET_TIME_Timestamp expire_deposit;
+
+ /**
+ * When do signatures with this denomination key become invalid?
+ * After this point, these signatures cannot be used in (legal)
+ * disputes anymore, as the Exchange is then allowed to destroy its side
+ * of the evidence. @e expire_legal is expected to be significantly
+ * larger than @e expire_deposit (by a year or more).
+ */
+ struct GNUNET_TIME_Timestamp expire_legal;
+
+ /**
+ * The value of this denomination
+ */
+ struct TALER_Amount value;
+
+ /**
+ * The applicable fee for withdrawing a coin of this denomination
+ */
+ struct TALER_Amount fee_withdraw;
+
+ /**
+ * The applicable fee to spend a coin of this denomination
+ */
+ struct TALER_Amount fee_deposit;
+
+ /**
+ * The applicable fee to melt/refresh a coin of this denomination
+ */
+ struct TALER_Amount fee_refresh;
+
+ /**
+ * The applicable fee to refund a coin of this denomination
+ */
+ struct TALER_Amount fee_refund;
+
+};
+
+
+/**
+ * @brief Information about future keys from the donau.
+ */
+struct TALER_DONAU_FutureKeys
+{
+
+ /**
+ * Array of the donau's online signing keys.
+ */
+ struct TALER_DONAU_FutureSigningPublicKey *sign_keys;
+
+ /**
+ * Array of the donau's denomination keys.
+ */
+ struct TALER_DONAU_FutureDenomPublicKey *denom_keys;
+
+ /**
+ * Public key of the signkey security module.
+ */
+ struct TALER_SecurityModulePublicKeyP signkey_secmod_public_key;
+
+ /**
+ * Public key of the RSA denomination security module.
+ */
+ struct TALER_SecurityModulePublicKeyP denom_secmod_public_key;
+
+ /**
+ * Public key of the CS denomination security module.
+ */
+ struct TALER_SecurityModulePublicKeyP denom_secmod_cs_public_key;
+
+ /**
+ * Offline master public key used by this donau.
+ */
+ struct TALER_MasterPublicKeyP master_pub;
+
+ /**
+ * Length of the @e sign_keys array (number of valid entries).
+ */
+ unsigned int num_sign_keys;
+
+ /**
+ * Length of the @e denom_keys array.
+ */
+ unsigned int num_denom_keys;
+
+};
+
+
+/**
+ * Response from a /management/keys request.
+ */
+struct TALER_DONAU_ManagementGetKeysResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Response details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details if HTTP status is #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * information about the various keys used
+ * by the donau
+ */
+ struct TALER_DONAU_FutureKeys keys;
+
+ } ok;
+ } details;
+
+};
+
+
+/**
+ * Function called with information about future keys.
+ *
+ * @param cls closure
+ * @param mgr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementGetKeysCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementGetKeysResponse *mgr);
+
+
+/**
+ * @brief Handle for a GET /management/keys request.
+ */
+struct TALER_DONAU_ManagementGetKeysHandle;
+
+
+/**
+ * Request future keys from the donau. The obtained information will be
+ * passed to the @a cb.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param cb function to call with the donau's future keys result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementGetKeysHandle *
+TALER_DONAU_get_management_keys (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ TALER_DONAU_ManagementGetKeysCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_get_management_keys() operation.
+ *
+ * @param gh handle of the operation to cancel
+ */
+void
+TALER_DONAU_get_management_keys_cancel (
+ struct TALER_DONAU_ManagementGetKeysHandle *gh);
+
+
+/**
+ * @brief Public information about a signature on an donau's online signing key
+ */
+struct TALER_DONAU_SigningKeySignature
+{
+ /**
+ * The signing public key
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * Signature over this signing key by the donau's master signature.
+ * Of purpose #TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY
+ */
+ struct TALER_MasterSignatureP master_sig;
+
+};
+
+
+/**
+ * @brief Public information about a signature on an donau's denomination key
+ */
+struct TALER_DONAU_DenominationKeySignature
+{
+ /**
+ * The hash of the denomination's public key
+ */
+ struct TALER_DenominationHashP h_denom_pub;
+
+ /**
+ * Signature over this denomination key by the donau's master signature.
+ * Of purpose #TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY.
+ */
+ struct TALER_MasterSignatureP master_sig;
+
+};
+
+
+/**
+ * Information needed for a POST /management/keys operation.
+ */
+struct TALER_DONAU_ManagementPostKeysData
+{
+
+ /**
+ * Array of the master signatures for the donau's online signing keys.
+ */
+ struct TALER_DONAU_SigningKeySignature *sign_sigs;
+
+ /**
+ * Array of the master signatures for the donau's denomination keys.
+ */
+ struct TALER_DONAU_DenominationKeySignature *denom_sigs;
+
+ /**
+ * Length of the @e sign_keys array (number of valid entries).
+ */
+ unsigned int num_sign_sigs;
+
+ /**
+ * Length of the @e denom_keys array.
+ */
+ unsigned int num_denom_sigs;
+};
+
+
+/**
+ * Response from a POST /management/keys request.
+ */
+struct TALER_DONAU_ManagementPostKeysResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+};
+
+
+/**
+ * Function called with information about the post keys operation result.
+ *
+ * @param cls closure
+ * @param mr response data
+ */
+typedef void
+(*TALER_DONAU_ManagementPostKeysCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementPostKeysResponse *mr);
+
+
+/**
+ * @brief Handle for a POST /management/keys request.
+ */
+struct TALER_DONAU_ManagementPostKeysHandle;
+
+
+/**
+ * Provide master-key signatures to the donau.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param pkd signature data to POST
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementPostKeysHandle *
+TALER_DONAU_post_management_keys (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_DONAU_ManagementPostKeysData *pkd,
+ TALER_DONAU_ManagementPostKeysCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_post_management_keys() operation.
+ *
+ * @param ph handle of the operation to cancel
+ */
+void
+TALER_DONAU_post_management_keys_cancel (
+ struct TALER_DONAU_ManagementPostKeysHandle *ph);
+
+
+/**
+ * Information needed for a POST /management/extensions operation.
+ *
+ * It represents the interface ExchangeKeysResponse as defined in
+ * https://docs.taler.net/design-documents/006-extensions.html#donau
+ */
+struct TALER_DONAU_ManagementPostExtensionsData
+{
+ const json_t *extensions;
+ struct TALER_MasterSignatureP extensions_sig;
+};
+
+
+/**
+ * Response from a POST /management/extensions request.
+ */
+struct TALER_DONAU_ManagementPostExtensionsResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+};
+
+
+/**
+ * Function called with information about the post extensions operation result.
+ *
+ * @param cls closure
+ * @param hr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementPostExtensionsCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementPostExtensionsResponse *hr);
+
+/**
+ * @brief Handle for a POST /management/extensions request.
+ */
+struct TALER_DONAU_ManagementPostExtensionsHandle;
+
+
+/**
+ * Uploads the configurations of enabled extensions to the donau, signed
+ * with the master key.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param ped signature data to POST
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementPostExtensionsHandle *
+TALER_DONAU_management_post_extensions (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_DONAU_ManagementPostExtensionsData *ped,
+ TALER_DONAU_ManagementPostExtensionsCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_post_extensions() operation.
+ *
+ * @param ph handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_post_extensions_cancel (
+ struct TALER_DONAU_ManagementPostExtensionsHandle *ph);
+
+
+/**
+ * Response from a POST /management/drain request.
+ */
+struct TALER_DONAU_ManagementDrainResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+};
+
+
+/**
+ * Function called with information about the drain profits result.
+ *
+ * @param cls closure
+ * @param hr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementDrainProfitsCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementDrainResponse *hr);
+
+
+/**
+ * @brief Handle for a POST /management/drain request.
+ */
+struct TALER_DONAU_ManagementDrainProfitsHandle;
+
+
+/**
+ * Uploads the drain profits request.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param wtid wire transfer identifier to use
+ * @param amount total to transfer
+ * @param date when was the request created
+ * @param account_section configuration section identifying account to debit
+ * @param payto_uri RFC 8905 URI of the account to credit
+ * @param master_sig signature affirming the operation
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementDrainProfitsHandle *
+TALER_DONAU_management_drain_profits (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_WireTransferIdentifierRawP *wtid,
+ const struct TALER_Amount *amount,
+ struct GNUNET_TIME_Timestamp date,
+ const char *account_section,
+ const char *payto_uri,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementDrainProfitsCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_drain_profits() operation.
+ *
+ * @param dp handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_drain_profits_cancel (
+ struct TALER_DONAU_ManagementDrainProfitsHandle *dp);
+
+
+/**
+ * Response from a POST /management/denominations/$DENOM/revoke request.
+ */
+struct TALER_DONAU_ManagementRevokeDenominationResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+};
+
+
+/**
+ * Function called with information about the post revocation operation result.
+ *
+ * @param cls closure
+ * @param hr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementRevokeDenominationKeyCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementRevokeDenominationResponse *hr);
+
+
+/**
+ * @brief Handle for a POST /management/denominations/$H_DENOM_PUB/revoke request.
+ */
+struct TALER_DONAU_ManagementRevokeDenominationKeyHandle;
+
+
+/**
+ * Inform the donau that a denomination key was revoked.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param h_denom_pub hash of the denomination public key that was revoked
+ * @param master_sig signature affirming the revocation
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementRevokeDenominationKeyHandle *
+TALER_DONAU_management_revoke_denomination_key (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_DenominationHashP *h_denom_pub,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementRevokeDenominationKeyCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_revoke_denomination_key() operation.
+ *
+ * @param rh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_revoke_denomination_key_cancel (
+ struct TALER_DONAU_ManagementRevokeDenominationKeyHandle *rh);
+
+
+/**
+ * Response from a POST /management/signkeys/$SK/revoke request.
+ */
+struct TALER_DONAU_ManagementRevokeSigningKeyResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+};
+
+/**
+ * Function called with information about the post revocation operation result.
+ *
+ * @param cls closure
+ * @param hr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementRevokeSigningKeyCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementRevokeSigningKeyResponse *hr);
+
+
+/**
+ * @brief Handle for a POST /management/signkeys/$H_DENOM_PUB/revoke request.
+ */
+struct TALER_DONAU_ManagementRevokeSigningKeyHandle;
+
+
+/**
+ * Inform the donau that a signing key was revoked.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param donau_pub the public signing key that was revoked
+ * @param master_sig signature affirming the revocation
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementRevokeSigningKeyHandle *
+TALER_DONAU_management_revoke_signing_key (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_ExchangePublicKeyP *donau_pub,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementRevokeSigningKeyCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_revoke_signing_key() operation.
+ *
+ * @param rh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_revoke_signing_key_cancel (
+ struct TALER_DONAU_ManagementRevokeSigningKeyHandle *rh);
+
+
+/**
+ * Response from a POST /management/aml-officers request.
+ */
+struct TALER_DONAU_ManagementUpdateAmlOfficerResponse
+{
+ /**
+ * HTTP response data
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+};
+
+/**
+ * Function called with information about the change to
+ * an AML officer status.
+ *
+ * @param cls closure
+ * @param hr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementUpdateAmlOfficerCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementUpdateAmlOfficerResponse *hr);
+
+
+/**
+ * @brief Handle for a POST /management/aml-officers/$OFFICER_PUB request.
+ */
+struct TALER_DONAU_ManagementUpdateAmlOfficer;
+
+
+/**
+ * Inform the donau that the status of an AML officer has changed.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param officer_pub the public signing key of the officer
+ * @param officer_name name of the officer
+ * @param change_date when to affect the status change
+ * @param is_active true to enable the officer
+ * @param read_only true to only allow read-only access
+ * @param master_sig signature affirming the change
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementUpdateAmlOfficer *
+TALER_DONAU_management_update_aml_officer (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_AmlOfficerPublicKeyP *officer_pub,
+ const char *officer_name,
+ struct GNUNET_TIME_Timestamp change_date,
+ bool is_active,
+ bool read_only,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementUpdateAmlOfficerCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_update_aml_officer() operation.
+ *
+ * @param rh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_update_aml_officer_cancel (
+ struct TALER_DONAU_ManagementUpdateAmlOfficer *rh);
+
+
+/**
+ * Summary data about an AML decision.
+ */
+struct TALER_DONAU_AmlDecisionSummary
+{
+ /**
+ * What is the current monthly threshold.
+ */
+ struct TALER_Amount threshold;
+
+ /**
+ * Account the decision was made for.
+ */
+ struct TALER_PaytoHashP h_payto;
+
+ /**
+ * RowID of this decision.
+ */
+ uint64_t rowid;
+
+ /**
+ * Current decision state.
+ */
+ enum TALER_AmlDecisionState current_state;
+};
+
+
+/**
+ * Information about AML decisions returned by the donau.
+ */
+struct TALER_DONAU_AmlDecisionsResponse
+{
+ /**
+ * HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP response code.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success (#MHD_HTTP_OK).
+ */
+ struct
+ {
+
+ /**
+ * Array of AML decision summaries returned by the donau.
+ */
+ const struct TALER_DONAU_AmlDecisionSummary *decisions;
+
+ /**
+ * Length of the @e decisions array.
+ */
+ unsigned int decisions_length;
+
+ } ok;
+
+ } details;
+};
+
+
+/**
+ * Function called with summary information about
+ * AML decisions.
+ *
+ * @param cls closure
+ * @param adr response data
+ */
+typedef void
+(*TALER_DONAU_LookupAmlDecisionsCallback) (
+ void *cls,
+ const struct TALER_DONAU_AmlDecisionsResponse *adr);
+
+
+/**
+ * @brief Handle for a POST /aml/$OFFICER_PUB/decisions/$STATUS request.
+ */
+struct TALER_DONAU_LookupAmlDecisions;
+
+
+/**
+ * Inform the donau that an AML decision has been taken.
+ *
+ * @param ctx the context
+ * @param donau_url HTTP base URL for the donau
+ * @param start row number starting point (exclusive rowid)
+ * @param delta number of records to return, negative for descending, positive for ascending from start
+ * @param state type of AML decisions to return
+ * @param officer_priv private key of the deciding AML officer
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_LookupAmlDecisions *
+TALER_DONAU_lookup_aml_decisions (
+ struct GNUNET_CURL_Context *ctx,
+ const char *donau_url,
+ uint64_t start,
+ int delta,
+ enum TALER_AmlDecisionState state,
+ const struct TALER_AmlOfficerPrivateKeyP *officer_priv,
+ TALER_DONAU_LookupAmlDecisionsCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_lookup_aml_decisions() operation.
+ *
+ * @param lh handle of the operation to cancel
+ */
+void
+TALER_DONAU_lookup_aml_decisions_cancel (
+ struct TALER_DONAU_LookupAmlDecisions *lh);
+
+
+/**
+ * Detailed data about an AML decision.
+ */
+struct TALER_DONAU_AmlDecisionDetail
+{
+ /**
+ * When was the decision made.
+ */
+ struct GNUNET_TIME_Timestamp decision_time;
+
+ /**
+ * New threshold set by this decision.
+ */
+ struct TALER_Amount new_threshold;
+
+ /**
+ * Who made the decision?
+ */
+ struct TALER_AmlOfficerPublicKeyP decider_pub;
+
+ /**
+ * Justification given for the decision.
+ */
+ const char *justification;
+
+ /**
+ * New decision state.
+ */
+ enum TALER_AmlDecisionState new_state;
+};
+
+
+/**
+ * Detailed data collected during a KYC process for the account.
+ */
+struct TALER_DONAU_KycHistoryDetail
+{
+ /**
+ * Configuration section name of the KYC provider that contributed the data.
+ */
+ const char *provider_section;
+
+ /**
+ * The collected KYC data.
+ */
+ const json_t *attributes;
+
+ /**
+ * When was the data collection made.
+ */
+ struct GNUNET_TIME_Timestamp collection_time;
+
+};
+
+
+/**
+ * Information about AML decision details returned by the donau.
+ */
+struct TALER_DONAU_AmlDecisionResponse
+{
+ /**
+ * HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP response code.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success (#MHD_HTTP_OK).
+ */
+ struct
+ {
+
+ /**
+ * Array of AML decision details returned by the donau.
+ */
+ const struct TALER_DONAU_AmlDecisionDetail *aml_history;
+
+ /**
+ * Length of the @e aml_history array.
+ */
+ unsigned int aml_history_length;
+
+ /**
+ * Array of KYC data collections returned by the donau.
+ */
+ const struct TALER_DONAU_KycHistoryDetail *kyc_attributes;
+
+ /**
+ * Length of the @e kyc_attributes array.
+ */
+ unsigned int kyc_attributes_length;
+
+ } ok;
+
+ } details;
+};
+
+
+/**
+ * Function called with summary information about
+ * AML decisions.
+ *
+ * @param cls closure
+ * @param adr response data
+ */
+typedef void
+(*TALER_DONAU_LookupAmlDecisionCallback) (
+ void *cls,
+ const struct TALER_DONAU_AmlDecisionResponse *adr);
+
+
+/**
+ * @brief Handle for a POST /aml/$OFFICER_PUB/decision/$H_PAYTO request.
+ */
+struct TALER_DONAU_LookupAmlDecision;
+
+
+/**
+ * Inform the donau that an AML decision has been taken.
+ *
+ * @param ctx the context
+ * @param donau_url HTTP base URL for the donau
+ * @param h_payto which account to return the decision history for
+ * @param officer_priv private key of the deciding AML officer
+ * @param history true to return the full history, otherwise only the last decision
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_LookupAmlDecision *
+TALER_DONAU_lookup_aml_decision (
+ struct GNUNET_CURL_Context *ctx,
+ const char *donau_url,
+ const struct TALER_PaytoHashP *h_payto,
+ const struct TALER_AmlOfficerPrivateKeyP *officer_priv,
+ bool history,
+ TALER_DONAU_LookupAmlDecisionCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_lookup_aml_decision() operation.
+ *
+ * @param rh handle of the operation to cancel
+ */
+void
+TALER_DONAU_lookup_aml_decision_cancel (
+ struct TALER_DONAU_LookupAmlDecision *rh);
+
+
+/**
+ * @brief Handle for a POST /aml-decision/$OFFICER_PUB request.
+ */
+struct TALER_DONAU_AddAmlDecision;
+
+
+/**
+ * Response when making an AML decision.
+ */
+struct TALER_DONAU_AddAmlDecisionResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+
+/**
+ * Function called with information about storing an
+ * an AML decision.
+ *
+ * @param cls closure
+ * @param adr response data
+ */
+typedef void
+(*TALER_DONAU_AddAmlDecisionCallback) (
+ void *cls,
+ const struct TALER_DONAU_AddAmlDecisionResponse *adr);
+
+/**
+ * Inform the donau that an AML decision has been taken.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param justification human-readable justification
+ * @param decision_time when was the decision made
+ * @param new_threshold at what monthly amount threshold
+ * should a revision be triggered
+ * @param h_payto payto URI hash of the account the
+ * decision is about
+ * @param new_state updated AML state
+ * @param kyc_requirements JSON array of KYC requirements being imposed, NULL for none
+ * @param officer_priv private key of the deciding AML officer
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_AddAmlDecision *
+TALER_DONAU_add_aml_decision (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const char *justification,
+ struct GNUNET_TIME_Timestamp decision_time,
+ const struct TALER_Amount *new_threshold,
+ const struct TALER_PaytoHashP *h_payto,
+ enum TALER_AmlDecisionState new_state,
+ const json_t *kyc_requirements,
+ const struct TALER_AmlOfficerPrivateKeyP *officer_priv,
+ TALER_DONAU_AddAmlDecisionCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_add_aml_decision() operation.
+ *
+ * @param rh handle of the operation to cancel
+ */
+void
+TALER_DONAU_add_aml_decision_cancel (
+ struct TALER_DONAU_AddAmlDecision *rh);
+
+
+/**
+ * Response when adding a partner donau.
+ */
+struct TALER_DONAU_ManagementAddPartnerResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+/**
+ * Function called with information about the change to
+ * an AML officer status.
+ *
+ * @param cls closure
+ * @param apr response data
+ */
+typedef void
+(*TALER_DONAU_ManagementAddPartnerCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementAddPartnerResponse *apr);
+
+
+/**
+ * @brief Handle for a POST /management/partners/$PARTNER_PUB request.
+ */
+struct TALER_DONAU_ManagementAddPartner;
+
+
+/**
+ * Inform the donau that the status of a partnering
+ * donau was defined.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param partner_pub the offline signing key of the partner
+ * @param start_date validity period start
+ * @param end_date validity period end
+ * @param wad_frequency how often will we do wad transfers to this partner
+ * @param wad_fee what is the wad fee to this partner
+ * @param partner_base_url what is the base URL of the @a partner_pub donau
+ * @param master_sig the signature the signature
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementAddPartner *
+TALER_DONAU_management_add_partner (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_MasterPublicKeyP *partner_pub,
+ struct GNUNET_TIME_Timestamp start_date,
+ struct GNUNET_TIME_Timestamp end_date,
+ struct GNUNET_TIME_Relative wad_frequency,
+ const struct TALER_Amount *wad_fee,
+ const char *partner_base_url,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementAddPartnerCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_add_partner() operation.
+ *
+ * @param rh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_add_partner_cancel (
+ struct TALER_DONAU_ManagementAddPartner *rh);
+
+
+/**
+ * Response when enabling an auditor.
+ */
+struct TALER_DONAU_ManagementAuditorEnableResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+/**
+ * Function called with information about the auditor setup operation result.
+ *
+ * @param cls closure
+ * @param aer response data
+ */
+typedef void
+(*TALER_DONAU_ManagementAuditorEnableCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementAuditorEnableResponse *aer);
+
+
+/**
+ * @brief Handle for a POST /management/auditors request.
+ */
+struct TALER_DONAU_ManagementAuditorEnableHandle;
+
+
+/**
+ * Inform the donau that an auditor should be enable or enabled.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param auditor_pub the public signing key of the auditor
+ * @param auditor_url base URL of the auditor
+ * @param auditor_name human readable name for the auditor
+ * @param validity_start when was this decided?
+ * @param master_sig signature affirming the auditor addition
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementAuditorEnableHandle *
+TALER_DONAU_management_enable_auditor (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_AuditorPublicKeyP *auditor_pub,
+ const char *auditor_url,
+ const char *auditor_name,
+ struct GNUNET_TIME_Timestamp validity_start,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementAuditorEnableCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_enable_auditor() operation.
+ *
+ * @param ah handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_enable_auditor_cancel (
+ struct TALER_DONAU_ManagementAuditorEnableHandle *ah);
+
+/**
+ * Response when disabling an auditor.
+ */
+struct TALER_DONAU_ManagementAuditorDisableResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+/**
+ * Function called with information about the auditor disable operation result.
+ *
+ * @param cls closure
+ * @param adr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementAuditorDisableCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementAuditorDisableResponse *adr);
+
+
+/**
+ * @brief Handle for a POST /management/auditors/$AUDITOR_PUB/disable request.
+ */
+struct TALER_DONAU_ManagementAuditorDisableHandle;
+
+
+/**
+ * Inform the donau that an auditor should be disabled.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param auditor_pub the public signing key of the auditor
+ * @param validity_end when was this decided?
+ * @param master_sig signature affirming the auditor addition
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementAuditorDisableHandle *
+TALER_DONAU_management_disable_auditor (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_AuditorPublicKeyP *auditor_pub,
+ struct GNUNET_TIME_Timestamp validity_end,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementAuditorDisableCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_disable_auditor() operation.
+ *
+ * @param ah handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_disable_auditor_cancel (
+ struct TALER_DONAU_ManagementAuditorDisableHandle *ah);
+
+
+/**
+ * Response from an donau account/enable operation.
+ */
+struct TALER_DONAU_ManagementWireEnableResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+
+/**
+ * Function called with information about the wire enable operation result.
+ *
+ * @param cls closure
+ * @param wer HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementWireEnableCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementWireEnableResponse *wer);
+
+
+/**
+ * @brief Handle for a POST /management/wire request.
+ */
+struct TALER_DONAU_ManagementWireEnableHandle;
+
+
+/**
+ * Inform the donau that a wire account should be enabled.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param payto_uri RFC 8905 URI of the donau's bank account
+ * @param conversion_url URL of the conversion service, or NULL if none
+ * @param debit_restrictions JSON encoding of debit restrictions on the account; see AccountRestriction in the spec
+ * @param credit_restrictions JSON encoding of credit restrictions on the account; see AccountRestriction in the spec
+ * @param validity_start when was this decided?
+ * @param master_sig1 signature affirming the wire addition
+ * of purpose #TALER_SIGNATURE_MASTER_ADD_WIRE
+ * @param master_sig2 signature affirming the validity of the account for clients;
+ * of purpose #TALER_SIGNATURE_MASTER_WIRE_DETAILS.
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementWireEnableHandle *
+TALER_DONAU_management_enable_wire (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const char *payto_uri,
+ const char *conversion_url,
+ const json_t *debit_restrictions,
+ const json_t *credit_restrictions,
+ struct GNUNET_TIME_Timestamp validity_start,
+ const struct TALER_MasterSignatureP *master_sig1,
+ const struct TALER_MasterSignatureP *master_sig2,
+ TALER_DONAU_ManagementWireEnableCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_enable_wire() operation.
+ *
+ * @param wh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_enable_wire_cancel (
+ struct TALER_DONAU_ManagementWireEnableHandle *wh);
+
+
+/**
+ * Response from an donau account/disable operation.
+ */
+struct TALER_DONAU_ManagementWireDisableResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+/**
+ * Function called with information about the wire disable operation result.
+ *
+ * @param cls closure
+ * @param wdr response data
+ */
+typedef void
+(*TALER_DONAU_ManagementWireDisableCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementWireDisableResponse *wdr);
+
+
+/**
+ * @brief Handle for a POST /management/wire/disable request.
+ */
+struct TALER_DONAU_ManagementWireDisableHandle;
+
+
+/**
+ * Inform the donau that a wire account should be disabled.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param payto_uri RFC 8905 URI of the donau's bank account
+ * @param validity_end when was this decided?
+ * @param master_sig signature affirming the wire addition
+ * of purpose #TALER_SIGNATURE_MASTER_DEL_WIRE
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementWireDisableHandle *
+TALER_DONAU_management_disable_wire (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const char *payto_uri,
+ struct GNUNET_TIME_Timestamp validity_end,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementWireDisableCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_disable_wire() operation.
+ *
+ * @param wh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_disable_wire_cancel (
+ struct TALER_DONAU_ManagementWireDisableHandle *wh);
+
+
+/**
+ * Response when setting wire fees.
+ */
+struct TALER_DONAU_ManagementSetWireFeeResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+/**
+ * Function called with information about the wire enable operation result.
+ *
+ * @param cls closure
+ * @param wfr response data
+ */
+typedef void
+(*TALER_DONAU_ManagementSetWireFeeCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementSetWireFeeResponse *wfr);
+
+
+/**
+ * @brief Handle for a POST /management/wire-fees request.
+ */
+struct TALER_DONAU_ManagementSetWireFeeHandle;
+
+
+/**
+ * Inform the donau about future wire fees.
+ *
+ * @param ctx the context
+ * @param donau_base_url HTTP base URL for the donau
+ * @param wire_method for which wire method are fees provided
+ * @param validity_start start date for the provided wire fees
+ * @param validity_end end date for the provided wire fees
+ * @param fees the wire fees for this time period
+ * @param master_sig signature affirming the wire fees;
+ * of purpose #TALER_SIGNATURE_MASTER_WIRE_FEES
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementSetWireFeeHandle *
+TALER_DONAU_management_set_wire_fees (
+ struct GNUNET_CURL_Context *ctx,
+ const char *donau_base_url,
+ const char *wire_method,
+ struct GNUNET_TIME_Timestamp validity_start,
+ struct GNUNET_TIME_Timestamp validity_end,
+ const struct TALER_WireFeeSet *fees,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementSetWireFeeCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_enable_wire() operation.
+ *
+ * @param swfh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_set_wire_fees_cancel (
+ struct TALER_DONAU_ManagementSetWireFeeHandle *swfh);
+
+
+/**
+ * Response when setting global fees.
+ */
+struct TALER_DONAU_ManagementSetGlobalFeeResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+
+/**
+ * Function called with information about the global fee setting operation result.
+ *
+ * @param cls closure
+ * @param gfr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ManagementSetGlobalFeeCallback) (
+ void *cls,
+ const struct TALER_DONAU_ManagementSetGlobalFeeResponse *gfr);
+
+
+/**
+ * @brief Handle for a POST /management/global-fees request.
+ */
+struct TALER_DONAU_ManagementSetGlobalFeeHandle;
+
+
+/**
+ * Inform the donau about global fees.
+ *
+ * @param ctx the context
+ * @param donau_base_url HTTP base URL for the donau
+ * @param validity_start start date for the provided wire fees
+ * @param validity_end end date for the provided wire fees
+ * @param fees the wire fees for this time period
+ * @param purse_timeout when do purses time out
+ * @param history_expiration how long are account histories preserved
+ * @param purse_account_limit how many purses are free per account
+ * @param master_sig signature affirming the wire fees;
+ * of purpose #TALER_SIGNATURE_MASTER_GLOBAL_FEES
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ManagementSetGlobalFeeHandle *
+TALER_DONAU_management_set_global_fees (
+ struct GNUNET_CURL_Context *ctx,
+ const char *donau_base_url,
+ struct GNUNET_TIME_Timestamp validity_start,
+ struct GNUNET_TIME_Timestamp validity_end,
+ const struct TALER_GlobalFeeSet *fees,
+ struct GNUNET_TIME_Relative purse_timeout,
+ struct GNUNET_TIME_Relative history_expiration,
+ uint32_t purse_account_limit,
+ const struct TALER_MasterSignatureP *master_sig,
+ TALER_DONAU_ManagementSetGlobalFeeCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_management_enable_wire() operation.
+ *
+ * @param sgfh handle of the operation to cancel
+ */
+void
+TALER_DONAU_management_set_global_fees_cancel (
+ struct TALER_DONAU_ManagementSetGlobalFeeHandle *sgfh);
+
+
+/**
+ * Response when adding denomination signature by auditor.
+ */
+struct TALER_DONAU_AuditorAddDenominationResponse
+{
+ /**
+ * HTTP response data.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+
+/**
+ * Function called with information about the POST
+ * /auditor/$AUDITOR_PUB/$H_DENOM_PUB operation result.
+ *
+ * @param cls closure
+ * @param adr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_AuditorAddDenominationCallback) (
+ void *cls,
+ const struct TALER_DONAU_AuditorAddDenominationResponse *adr);
+
+
+/**
+ * @brief Handle for a POST /auditor/$AUDITOR_PUB/$H_DENOM_PUB request.
+ */
+struct TALER_DONAU_AuditorAddDenominationHandle;
+
+
+/**
+ * Provide auditor signatures for a denomination to the donau.
+ *
+ * @param ctx the context
+ * @param url HTTP base URL for the donau
+ * @param h_denom_pub hash of the public key of the denomination
+ * @param auditor_pub public key of the auditor
+ * @param auditor_sig signature of the auditor, of
+ * purpose #TALER_SIGNATURE_AUDITOR_DONAU_KEYS
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_AuditorAddDenominationHandle *
+TALER_DONAU_add_auditor_denomination (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_DenominationHashP *h_denom_pub,
+ const struct TALER_AuditorPublicKeyP *auditor_pub,
+ const struct TALER_AuditorSignatureP *auditor_sig,
+ TALER_DONAU_AuditorAddDenominationCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_add_auditor_denomination() operation.
+ *
+ * @param ah handle of the operation to cancel
+ */
+void
+TALER_DONAU_add_auditor_denomination_cancel (
+ struct TALER_DONAU_AuditorAddDenominationHandle *ah);
+
+
+/* ********************* W2W API ****************** */
+
+
+/**
+ * Response generated for a contract get request.
+ */
+struct TALER_DONAU_ContractGetResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP status code.
+ */
+ union
+ {
+ /**
+ * Information returned on #MHD_HTTP_OK.
+ */
+ struct
+ {
+
+ /**
+ * Public key of the purse.
+ */
+ struct TALER_PurseContractPublicKeyP purse_pub;
+
+ /**
+ * Encrypted contract.
+ */
+ const void *econtract;
+
+ /**
+ * Number of bytes in @e econtract.
+ */
+ size_t econtract_size;
+
+ } ok;
+
+ } details;
+
+};
+
+/**
+ * Function called with information about the a purse.
+ *
+ * @param cls closure
+ * @param cgr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ContractGetCallback) (
+ void *cls,
+ const struct TALER_DONAU_ContractGetResponse *cgr);
+
+
+/**
+ * @brief Handle for a GET /contracts/$CPUB request.
+ */
+struct TALER_DONAU_ContractsGetHandle;
+
+
+/**
+ * Request information about a contract from the donau.
+ *
+ * @param ctx CURL context
+ * @param url donau base URL
+ * @param contract_priv private key of the contract
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_ContractsGetHandle *
+TALER_DONAU_contract_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_ContractDiffiePrivateP *contract_priv,
+ TALER_DONAU_ContractGetCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_contract_get() operation.
+ *
+ * @param cgh handle of the operation to cancel
+ */
+void
+TALER_DONAU_contract_get_cancel (
+ struct TALER_DONAU_ContractsGetHandle *cgh);
+
+
+/**
+ * Response generated for a purse get request.
+ */
+struct TALER_DONAU_PurseGetResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Response on #MHD_HTTP_OK.
+ */
+ struct
+ {
+
+ /**
+ * Time when the purse was merged (or zero if it
+ * was not merged).
+ */
+ struct GNUNET_TIME_Timestamp merge_timestamp;
+
+ /**
+ * Time when the full amount was deposited into
+ * the purse (or zero if a sufficient amount
+ * was not yet deposited).
+ */
+ struct GNUNET_TIME_Timestamp deposit_timestamp;
+
+ /**
+ * Reserve balance (how much was deposited in
+ * total into the reserve, minus deposit fees).
+ */
+ struct TALER_Amount balance;
+
+ /**
+ * Time when the purse will expire.
+ */
+ struct GNUNET_TIME_Timestamp purse_expiration;
+
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Function called with information about the a purse.
+ *
+ * @param cls closure
+ * @param pgr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_PurseGetCallback) (
+ void *cls,
+ const struct TALER_DONAU_PurseGetResponse *pgr);
+
+
+/**
+ * @brief Handle for a GET /purses/$PPUB request.
+ */
+struct TALER_DONAU_PurseGetHandle;
+
+
+/**
+ * Request information about a purse from the donau.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param purse_pub public key of the purse
+ * @param timeout how long to wait for a change to happen
+ * @param wait_for_merge true to wait for a merge event, otherwise wait for a deposit event
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_PurseGetHandle *
+TALER_DONAU_purse_get (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_PurseContractPublicKeyP *purse_pub,
+ struct GNUNET_TIME_Relative timeout,
+ bool wait_for_merge,
+ TALER_DONAU_PurseGetCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_purse_get() operation.
+ *
+ * @param pgh handle of the operation to cancel
+ */
+void
+TALER_DONAU_purse_get_cancel (
+ struct TALER_DONAU_PurseGetHandle *pgh);
+
+
+/**
+ * Response generated for a purse creation request.
+ */
+struct TALER_DONAU_PurseCreateDepositResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP status.
+ */
+ union
+ {
+
+ /**
+ * Detailed returned on #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Signing key used by the donau to sign the
+ * purse create with deposit confirmation.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * Signature from the donau on the
+ * purse create with deposit confirmation.
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+
+ } ok;
+
+ } details;
+
+};
+
+/**
+ * Function called with information about the creation
+ * of a new purse.
+ *
+ * @param cls closure
+ * @param pcr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_PurseCreateDepositCallback) (
+ void *cls,
+ const struct TALER_DONAU_PurseCreateDepositResponse *pcr);
+
+
+/**
+ * @brief Handle for a POST /purses/$PID/create request.
+ */
+struct TALER_DONAU_PurseCreateDepositHandle;
+
+
+/**
+ * Information about a coin to be deposited into a purse or reserve.
+ */
+struct TALER_DONAU_PurseDeposit
+{
+ /**
+ * Age commitment data, might be NULL.
+ */
+ const struct TALER_AgeCommitmentProof *age_commitment_proof;
+
+ /**
+ * Private key of the coin.
+ */
+ struct TALER_CoinSpendPrivateKeyP coin_priv;
+
+ /**
+ * Signature proving the validity of the coin.
+ */
+ struct TALER_DenominationSignature denom_sig;
+
+ /**
+ * Hash of the denomination's public key.
+ */
+ struct TALER_DenominationHashP h_denom_pub;
+
+ /**
+ * Amount of the coin to transfer into the purse.
+ */
+ struct TALER_Amount amount;
+
+};
+
+
+/**
+ * Inform the donau that a purse should be created
+ * and coins deposited into it.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param purse_priv private key of the purse
+ * @param merge_priv the merge credential
+ * @param contract_priv key needed to obtain and decrypt the contract
+ * @param contract_terms contract the purse is about
+ * @param num_deposits length of the @a deposits array
+ * @param deposits array of deposits to make into the purse
+ * @param upload_contract true to upload the contract; must
+ * be FALSE for repeated calls to this API for the
+ * same purse (i.e. when adding more deposits).
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_PurseCreateDepositHandle *
+TALER_DONAU_purse_create_with_deposit (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_PurseContractPrivateKeyP *purse_priv,
+ const struct TALER_PurseMergePrivateKeyP *merge_priv,
+ const struct TALER_ContractDiffiePrivateP *contract_priv,
+ const json_t *contract_terms,
+ unsigned int num_deposits,
+ const struct TALER_DONAU_PurseDeposit deposits[static num_deposits],
+ bool upload_contract,
+ TALER_DONAU_PurseCreateDepositCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_purse_create_with_deposit() operation.
+ *
+ * @param pch handle of the operation to cancel
+ */
+void
+TALER_DONAU_purse_create_with_deposit_cancel (
+ struct TALER_DONAU_PurseCreateDepositHandle *pch);
+
+
+/**
+ * Response generated for a purse deletion request.
+ */
+struct TALER_DONAU_PurseDeleteResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+};
+
+
+/**
+ * Function called with information about the deletion
+ * of a purse.
+ *
+ * @param cls closure
+ * @param pdr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_PurseDeleteCallback) (
+ void *cls,
+ const struct TALER_DONAU_PurseDeleteResponse *pdr);
+
+
+/**
+ * @brief Handle for a DELETE /purses/$PID request.
+ */
+struct TALER_DONAU_PurseDeleteHandle;
+
+
+/**
+ * Asks the donau to delete a purse. Will only succeed if
+ * the purse was not yet merged and did not yet time out.
+ *
+ * @param ctx CURL context
+ * @param url donau base URL
+ * @param purse_priv private key of the purse
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_PurseDeleteHandle *
+TALER_DONAU_purse_delete (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_PurseContractPrivateKeyP *purse_priv,
+ TALER_DONAU_PurseDeleteCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_purse_delete() operation.
+ *
+ * @param pdh handle of the operation to cancel
+ */
+void
+TALER_DONAU_purse_delete_cancel (
+ struct TALER_DONAU_PurseDeleteHandle *pdh);
+
+
+/**
+ * Response generated for an account merge request.
+ */
+struct TALER_DONAU_AccountMergeResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Reserve signature affirming the merge.
+ */
+ const struct TALER_ReserveSignatureP *reserve_sig;
+
+ /**
+ * Details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Detailed returned on #MHD_HTTP_OK.
+ */
+ struct
+ {
+ /**
+ * Signature by the donau affirming the merge.
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+ /**
+ * Online signing key used by the donau.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * Timestamp of the donau for @e donau_sig.
+ */
+ struct GNUNET_TIME_Timestamp etime;
+
+ } ok;
+
+ /**
+ * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
+ */
+ struct
+ {
+ /**
+ * Requirement row target that the merchant should use
+ * to check for its KYC status.
+ */
+ uint64_t requirement_row;
+ } unavailable_for_legal_reasons;
+
+ } details;
+
+};
+
+/**
+ * Function called with information about an account merge
+ * operation.
+ *
+ * @param cls closure
+ * @param amr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_AccountMergeCallback) (
+ void *cls,
+ const struct TALER_DONAU_AccountMergeResponse *amr);
+
+
+/**
+ * @brief Handle for a POST /purses/$PID/merge request.
+ */
+struct TALER_DONAU_AccountMergeHandle;
+
+
+/**
+ * Inform the donau that a purse should be merged
+ * with a reserve.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param reserve_donau_url base URL of the donau with the reserve
+ * @param reserve_priv private key of the reserve to merge into
+ * @param purse_pub public key of the purse to merge
+ * @param merge_priv private key granting us the right to merge
+ * @param h_contract_terms hash of the purses' contract
+ * @param min_age minimum age of deposits into the purse
+ * @param purse_value_after_fees amount that should be in the purse
+ * @param purse_expiration when will the purse expire
+ * @param merge_timestamp when is the merge happening (current time)
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_AccountMergeHandle *
+TALER_DONAU_account_merge (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const char *reserve_donau_url,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ const struct TALER_PurseContractPublicKeyP *purse_pub,
+ const struct TALER_PurseMergePrivateKeyP *merge_priv,
+ const struct TALER_PrivateContractHashP *h_contract_terms,
+ uint8_t min_age,
+ const struct TALER_Amount *purse_value_after_fees,
+ struct GNUNET_TIME_Timestamp purse_expiration,
+ struct GNUNET_TIME_Timestamp merge_timestamp,
+ TALER_DONAU_AccountMergeCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_account_merge() operation.
+ *
+ * @param amh handle of the operation to cancel
+ */
+void
+TALER_DONAU_account_merge_cancel (
+ struct TALER_DONAU_AccountMergeHandle *amh);
+
+
+/**
+ * Response generated for a purse creation request.
+ */
+struct TALER_DONAU_PurseCreateMergeResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Reserve signature generated for the request
+ * (client-side).
+ */
+ const struct TALER_ReserveSignatureP *reserve_sig;
+
+ /**
+ * Details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Details returned on #MHD_HTTP_OK.
+ */
+ struct
+ {
+
+ } ok;
+
+ /**
+ * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
+ */
+ struct
+ {
+ /**
+ * Requirement row that the merchant should use
+ * to check for its KYC status.
+ */
+ uint64_t requirement_row;
+ } unavailable_for_legal_reasons;
+
+ } details;
+
+};
+
+/**
+ * Function called with information about the creation
+ * of a new purse.
+ *
+ * @param cls closure
+ * @param pcr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_PurseCreateMergeCallback) (
+ void *cls,
+ const struct TALER_DONAU_PurseCreateMergeResponse *pcr);
+
+
+/**
+ * @brief Handle for a POST /reserves/$RID/purse request.
+ */
+struct TALER_DONAU_PurseCreateMergeHandle;
+
+
+/**
+ * Inform the donau that a purse should be created
+ * and merged with a reserve.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param reserve_priv private key of the reserve
+ * @param purse_priv private key of the purse
+ * @param merge_priv private key of the merge capability
+ * @param contract_priv private key to get the contract
+ * @param contract_terms contract the purse is about
+ * @param upload_contract true to upload the contract
+ * @param pay_for_purse true to pay for purse creation
+ * @param merge_timestamp when should the merge happen (use current time)
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_PurseCreateMergeHandle *
+TALER_DONAU_purse_create_with_merge (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ const struct TALER_PurseContractPrivateKeyP *purse_priv,
+ const struct TALER_PurseMergePrivateKeyP *merge_priv,
+ const struct TALER_ContractDiffiePrivateP *contract_priv,
+ const json_t *contract_terms,
+ bool upload_contract,
+ bool pay_for_purse,
+ struct GNUNET_TIME_Timestamp merge_timestamp,
+ TALER_DONAU_PurseCreateMergeCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_purse_create_with_merge() operation.
+ *
+ * @param pcm handle of the operation to cancel
+ */
+void
+TALER_DONAU_purse_create_with_merge_cancel (
+ struct TALER_DONAU_PurseCreateMergeHandle *pcm);
+
+
+/**
+ * Response generated for purse deposit request.
+ */
+struct TALER_DONAU_PurseDepositResponse
+{
+ /**
+ * Full HTTP response.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on the HTTP status.
+ */
+ union
+ {
+ /**
+ * Detailed returned on #MHD_HTTP_OK.
+ */
+ struct
+ {
+
+ /**
+ * When does the purse expire.
+ */
+ struct GNUNET_TIME_Timestamp purse_expiration;
+
+ /**
+ * How much was actually deposited into the purse.
+ */
+ struct TALER_Amount total_deposited;
+
+ /**
+ * How much should be in the purse in total in the end.
+ */
+ struct TALER_Amount purse_value_after_fees;
+
+ /**
+ * Hash of the contract (needed to verify signature).
+ */
+ struct TALER_PrivateContractHashP h_contract_terms;
+
+ } ok;
+ } details;
+
+};
+
+/**
+ * Function called with information about a purse-deposit
+ * operation.
+ *
+ * @param cls closure
+ * @param pdr HTTP response data
+ */
+typedef void
+(*TALER_DONAU_PurseDepositCallback) (
+ void *cls,
+ const struct TALER_DONAU_PurseDepositResponse *pdr);
+
+
+/**
+ * @brief Handle for a POST /purses/$PID/deposit request.
+ */
+struct TALER_DONAU_PurseDepositHandle;
+
+
+/**
+ * Inform the donau that a deposit should be made into
+ * a purse.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param purse_donau_url base URL of the donau hosting the purse
+ * @param purse_pub public key of the purse to merge
+ * @param min_age minimum age we need to prove for the purse
+ * @param num_deposits length of the @a deposits array
+ * @param deposits array of deposits to make into the purse
+ * @param cb function to call with the donau's result
+ * @param cb_cls closure for @a cb
+ * @return the request handle; NULL upon error
+ */
+struct TALER_DONAU_PurseDepositHandle *
+TALER_DONAU_purse_deposit (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const char *purse_donau_url,
+ const struct TALER_PurseContractPublicKeyP *purse_pub,
+ uint8_t min_age,
+ unsigned int num_deposits,
+ const struct TALER_DONAU_PurseDeposit deposits[static num_deposits],
+ TALER_DONAU_PurseDepositCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel #TALER_DONAU_purse_deposit() operation.
+ *
+ * @param amh handle of the operation to cancel
+ */
+void
+TALER_DONAU_purse_deposit_cancel (
+ struct TALER_DONAU_PurseDepositHandle *amh);
+
+
+/* ********************* /reserves/$RID/open *********************** */
+
+
+/**
+ * @brief A /reserves/$RID/open Handle
+ */
+struct TALER_DONAU_ReservesOpenHandle;
+
+
+/**
+ * @brief Reserve open result details.
+ */
+struct TALER_DONAU_ReserveOpenResult
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+ /**
+ * New expiration time
+ */
+ struct GNUNET_TIME_Timestamp expiration_time;
+
+ /**
+ * Actual cost of the open operation.
+ */
+ struct TALER_Amount open_cost;
+
+ } ok;
+
+
+ /**
+ * Information returned if the payment provided is insufficient, if
+ * @e hr.http_status is #MHD_HTTP_PAYMENT_REQUIRED
+ */
+ struct
+ {
+ /**
+ * Current expiration time of the reserve.
+ */
+ struct GNUNET_TIME_Timestamp expiration_time;
+
+ /**
+ * Actual cost of the open operation that should have been paid.
+ */
+ struct TALER_Amount open_cost;
+
+ } payment_required;
+
+
+ /**
+ * Information returned if KYC is required to proceed, set if
+ * @e hr.http_status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
+ */
+ struct
+ {
+ /**
+ * Requirement row that the merchant should use
+ * to check for its KYC status.
+ */
+ uint64_t requirement_row;
+
+ /**
+ * Hash of the payto-URI of the account to KYC;
+ */
+ struct TALER_PaytoHashP h_payto;
+
+ } unavailable_for_legal_reasons;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve open request to a donau.
+ *
+ * @param cls closure
+ * @param ror HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesOpenCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReserveOpenResult *ror);
+
+
+/**
+ * Submit a request to open a reserve.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param keys donau keys
+ * @param reserve_priv private key of the reserve to open
+ * @param reserve_contribution amount to pay from the reserve's balance for the operation
+ * @param coin_payments_length length of the @a coin_payments array
+ * @param coin_payments array of coin payments to use for opening the reserve
+ * @param expiration_time desired new expiration time for the reserve
+ * @param min_purses minimum number of purses to allow being concurrently opened per reserve
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesOpenHandle *
+TALER_DONAU_reserves_open (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ struct TALER_DONAU_Keys *keys,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ const struct TALER_Amount *reserve_contribution,
+ unsigned int coin_payments_length,
+ const struct TALER_DONAU_PurseDeposit coin_payments[
+ static coin_payments_length],
+ struct GNUNET_TIME_Timestamp expiration_time,
+ uint32_t min_purses,
+ TALER_DONAU_ReservesOpenCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a reserve status request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param[in] roh the reserve open request handle
+ */
+void
+TALER_DONAU_reserves_open_cancel (
+ struct TALER_DONAU_ReservesOpenHandle *roh);
+
+
+/* ********************* /reserves/$RID/attest *********************** */
+
+
+/**
+ * @brief A Get /reserves/$RID/attest Handle
+ */
+struct TALER_DONAU_ReservesGetAttestHandle;
+
+
+/**
+ * @brief Reserve GET attest result details.
+ */
+struct TALER_DONAU_ReserveGetAttestResult
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+
+ /**
+ * Length of the @e attributes array.
+ */
+ unsigned int attributes_length;
+
+ /**
+ * Array of attributes available about the user.
+ */
+ const char **attributes;
+
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve attest request to a donau.
+ *
+ * @param cls closure
+ * @param ror HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesGetAttestCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReserveGetAttestResult *ror);
+
+
+/**
+ * Submit a request to get the list of attestable attributes for a reserve.
+ *
+ * @param ctx CURL context
+ * @param url donau base URL
+ * @param reserve_pub public key of the reserve to get available attributes for
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesGetAttestHandle *
+TALER_DONAU_reserves_get_attestable (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_ReservePublicKeyP *reserve_pub,
+ TALER_DONAU_ReservesGetAttestCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a request to get attestable attributes. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param rgah the reserve get attestable request handle
+ */
+void
+TALER_DONAU_reserves_get_attestable_cancel (
+ struct TALER_DONAU_ReservesGetAttestHandle *rgah);
+
+
+/**
+ * @brief A POST /reserves/$RID/attest Handle
+ */
+struct TALER_DONAU_ReservesPostAttestHandle;
+
+
+/**
+ * @brief Reserve attest result details.
+ */
+struct TALER_DONAU_ReservePostAttestResult
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+ /**
+ * Time when the donau made the signature.
+ */
+ struct GNUNET_TIME_Timestamp donau_time;
+
+ /**
+ * Expiration time of the attested attributes.
+ */
+ struct GNUNET_TIME_Timestamp expiration_time;
+
+ /**
+ * Signature by the donau affirming the attributes.
+ */
+ struct TALER_ExchangeSignatureP donau_sig;
+
+ /**
+ * Online signing key used by the donau.
+ */
+ struct TALER_ExchangePublicKeyP donau_pub;
+
+ /**
+ * Attributes being confirmed by the donau.
+ */
+ const json_t *attributes;
+
+ } ok;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve attest request to a donau.
+ *
+ * @param cls closure
+ * @param ror HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesPostAttestCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReservePostAttestResult *ror);
+
+
+/**
+ * Submit a request to attest attributes about the owner of a reserve.
+ *
+ * @param ctx CURL context
+ * @param url donau base URL
+ * @param reserve_priv private key of the reserve to attest
+ * @param attributes_length length of the @a attributes array
+ * @param attributes array of names of attributes to get attestations for
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesAttestHandle *
+TALER_DONAU_reserves_attest (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ unsigned int attributes_length,
+ const char *attributes[const static attributes_length],
+ TALER_DONAU_ReservesPostAttestCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a reserve attestation request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param rah the reserve attest request handle
+ */
+void
+TALER_DONAU_reserves_attest_cancel (
+ struct TALER_DONAU_ReservesAttestHandle *rah);
+
+
+/* ********************* /reserves/$RID/close *********************** */
+
+
+/**
+ * @brief A /reserves/$RID/close Handle
+ */
+struct TALER_DONAU_ReservesCloseHandle;
+
+
+/**
+ * @brief Reserve close result details.
+ */
+struct TALER_DONAU_ReserveCloseResult
+{
+
+ /**
+ * High-level HTTP response details.
+ */
+ struct TALER_DONAU_HttpResponse hr;
+
+ /**
+ * Details depending on @e hr.http_status.
+ */
+ union
+ {
+
+ /**
+ * Information returned on success, if
+ * @e hr.http_status is #MHD_HTTP_OK
+ */
+ struct
+ {
+
+ /**
+ * Amount wired to the target account.
+ */
+ struct TALER_Amount wire_amount;
+ } ok;
+
+ /**
+ * Information returned if KYC is required to proceed, set if
+ * @e hr.http_status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
+ */
+ struct
+ {
+ /**
+ * Requirement row that the merchant should use
+ * to check for its KYC status.
+ */
+ uint64_t requirement_row;
+
+ /**
+ * Hash of the payto-URI of the account to KYC;
+ */
+ struct TALER_PaytoHashP h_payto;
+
+ } unavailable_for_legal_reasons;
+
+ } details;
+
+};
+
+
+/**
+ * Callbacks of this type are used to serve the result of submitting a
+ * reserve close request to a donau.
+ *
+ * @param cls closure
+ * @param ror HTTP response data
+ */
+typedef void
+(*TALER_DONAU_ReservesCloseCallback) (
+ void *cls,
+ const struct TALER_DONAU_ReserveCloseResult *ror);
+
+
+/**
+ * Submit a request to close a reserve.
+ *
+ * @param ctx curl context
+ * @param url donau base URL
+ * @param reserve_priv private key of the reserve to close
+ * @param target_payto_uri where to send the payment, NULL to send to reserve origin
+ * @param cb the callback to call when a reply for this request is available
+ * @param cb_cls closure for the above callback
+ * @return a handle for this request; NULL if the inputs are invalid (i.e.
+ * signatures fail to verify). In this case, the callback is not called.
+ */
+struct TALER_DONAU_ReservesCloseHandle *
+TALER_DONAU_reserves_close (
+ struct GNUNET_CURL_Context *ctx,
+ const char *url,
+ const struct TALER_ReservePrivateKeyP *reserve_priv,
+ const char *target_payto_uri,
+ TALER_DONAU_ReservesCloseCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Cancel a reserve status request. This function cannot be used
+ * on a request handle if a response is already served for it.
+ *
+ * @param rch the reserve request handle
+ */
+void
+TALER_DONAU_reserves_close_cancel (
+ struct TALER_DONAU_ReservesCloseHandle *rch);
+
+#endif /* _TALER_DONAU_SERVICE_H */
diff --git a/src/include/taler_donaudb_lib.h b/src/include/taler_donaudb_lib.h
@@ -0,0 +1,199 @@
+
+ This file is part of TALER
+ Copyright (C) 2014-2020 Taler Systems SA
+
+ TALER is free software; you can redistribute it and/or modify it under the
+ terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
+*/
+/**
+ * @file include/taler_exchangedb_lib.h
+ * @brief IO operations for the exchange's private keys
+ * @author Florian Dold
+ * @author Benedikt Mueller
+ * @author Christian Grothoff
+ */
+#ifndef TALER_EXCHANGEDB_LIB_H
+#define TALER_EXCHANGEDB_LIB_H
+
+#include "taler_signatures.h"
+#include "taler_exchangedb_plugin.h"
+#include "taler_bank_service.h"
+
+
+/**
+ * Initialize the plugin.
+ *
+ * @param cfg configuration to use
+ * @return NULL on failure
+ */
+struct TALER_EXCHANGEDB_Plugin *
+TALER_EXCHANGEDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg);
+
+
+/**
+ * Shutdown the plugin.
+ *
+ * @param plugin plugin to unload
+ */
+void
+TALER_EXCHANGEDB_plugin_unload (struct TALER_EXCHANGEDB_Plugin *plugin);
+
+/**
+ * Information about an account from the configuration.
+ */
+struct TALER_EXCHANGEDB_AccountInfo
+{
+ /**
+ * Authentication data. Only parsed if
+ * #TALER_EXCHANGEDB_ALO_AUTHDATA was set.
+ */
+ const struct TALER_BANK_AuthenticationData *auth;
+
+ /**
+ * Section in the configuration file that specifies the
+ * account. Must start with "exchange-account-".
+ */
+ const char *section_name;
+
+ /**
+ * Name of the wire method used by this account.
+ */
+ const char *method;
+
+ /**
+ * true if this account is enabed to be debited
+ * by the taler-exchange-aggregator.
+ */
+ bool debit_enabled;
+
+ /**
+ * true if this account is enabed to be credited by wallets
+ * and needs to be watched by the taler-exchange-wirewatch.
+ * Also, the account will only be included in /wire if credit
+ * is enabled.
+ */
+ bool credit_enabled;
+};
+
+
+/**
+ * Calculate the total value of all transactions performed.
+ * Stores @a off plus the cost of all transactions in @a tl
+ * in @a ret.
+ *
+ * @param tl transaction list to process
+ * @param off offset to use as the starting value
+ * @param[out] ret where the resulting total is to be stored
+ * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
+ */
+enum GNUNET_GenericReturnValue
+TALER_EXCHANGEDB_calculate_transaction_list_totals (
+ struct TALER_EXCHANGEDB_TransactionList *tl,
+ const struct TALER_Amount *off,
+ struct TALER_Amount *ret);
+
+
+/**
+ * Function called with information about a wire account.
+ *
+ * @param cls closure
+ * @param ai account information
+ */
+typedef void
+(*TALER_EXCHANGEDB_AccountCallback)(
+ void *cls,
+ const struct TALER_EXCHANGEDB_AccountInfo *ai);
+
+
+/**
+ * Return information about all accounts that
+ * were loaded by #TALER_EXCHANGEDB_load_accounts().
+ *
+ * @param cb callback to invoke
+ * @param cb_cls closure for @a cb
+ */
+void
+TALER_EXCHANGEDB_find_accounts (TALER_EXCHANGEDB_AccountCallback cb,
+ void *cb_cls);
+
+
+/**
+ * Find the wire plugin for the given payto:// URL.
+ * Only useful after the accounts have been loaded
+ * using #TALER_EXCHANGEDB_load_accounts().
+ *
+ * @param method wire method we need an account for
+ * @return NULL on error
+ */
+const struct TALER_EXCHANGEDB_AccountInfo *
+TALER_EXCHANGEDB_find_account_by_method (const char *method);
+
+
+/**
+ * Find the wire plugin for the given payto:// URL
+ * Only useful after the accounts have been loaded
+ * using #TALER_EXCHANGEDB_load_accounts().
+ *
+ * @param url wire address we need an account for
+ * @return NULL on error
+ */
+const struct TALER_EXCHANGEDB_AccountInfo *
+TALER_EXCHANGEDB_find_account_by_payto_uri (const char *url);
+
+
+/**
+ * Options for #TALER_EXCHANGEDB_load_accounts()
+ */
+enum TALER_EXCHANGEDB_AccountLoaderOptions
+{
+ TALER_EXCHANGEDB_ALO_NONE = 0,
+
+ /**
+ * Load accounts enabled for DEBITs.
+ */
+ TALER_EXCHANGEDB_ALO_DEBIT = 1,
+
+ /**
+ * Load accounts enabled for CREDITs.
+ */
+ TALER_EXCHANGEDB_ALO_CREDIT = 2,
+
+ /**
+ * Load authentication data from the
+ * "taler-accountcredentials-" section
+ * to access the account at the bank.
+ */
+ TALER_EXCHANGEDB_ALO_AUTHDATA = 4
+};
+
+
+/**
+ * Load account information opf the exchange from
+ * @a cfg.
+ *
+ * @param cfg configuration to load from
+ * @param options loader options
+ * @return #GNUNET_OK on success, #GNUNET_NO if no accounts are configured
+ */
+enum GNUNET_GenericReturnValue
+TALER_EXCHANGEDB_load_accounts (
+ const struct GNUNET_CONFIGURATION_Handle *cfg,
+ enum TALER_EXCHANGEDB_AccountLoaderOptions options);
+
+
+/**
+ * Free resources allocated by
+ * #TALER_EXCHANGEDB_load_accounts().
+ */
+void
+TALER_EXCHANGEDB_unload_accounts (void);
+
+#endif
diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_donaudb_plugin.h
diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h
@@ -1,7261 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2023 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 <http://www.gnu.org/licenses/>
- */
-/**
- * @file include/taler_exchange_service.h
- * @brief C interface of libtalerexchange, a C library to use exchange's HTTP API
- * @author Sree Harsha Totakura <sreeharsha@totakura.in>
- * @author Christian Grothoff
- * @author Özgür Kesim
- */
-#ifndef _TALER_EXCHANGE_SERVICE_H
-#define _TALER_EXCHANGE_SERVICE_H
-
-#include <jansson.h>
-#include "taler_util.h"
-#include "taler_error_codes.h"
-#include "taler_kyclogic_lib.h"
-#include <gnunet/gnunet_curl_lib.h>
-
-
-/* ********************* /keys *********************** */
-
-
-/**
- * @brief Exchange's signature key
- */
-struct TALER_EXCHANGE_SigningPublicKey
-{
- /**
- * The signing public key
- */
- struct TALER_ExchangePublicKeyP key;
-
- /**
- * Signature over this signing key by the exchange's master signature.
- */
- struct TALER_MasterSignatureP master_sig;
-
- /**
- * Validity start time
- */
- struct GNUNET_TIME_Timestamp valid_from;
-
- /**
- * Validity expiration time (how long the exchange may use it).
- */
- struct GNUNET_TIME_Timestamp valid_until;
-
- /**
- * Validity expiration time for legal disputes.
- */
- struct GNUNET_TIME_Timestamp valid_legal;
-};
-
-
-/**
- * @brief Public information about a exchange's denomination key
- */
-struct TALER_EXCHANGE_DenomPublicKey
-{
- /**
- * The public key
- */
- struct TALER_DenominationPublicKey key;
-
- /**
- * The hash of the public key.
- */
- struct TALER_DenominationHashP h_key;
-
- /**
- * Exchange's master signature over this denomination record.
- */
- struct TALER_MasterSignatureP master_sig;
-
- /**
- * Timestamp indicating when the denomination key becomes valid
- */
- struct GNUNET_TIME_Timestamp valid_from;
-
- /**
- * Timestamp indicating when the denomination key can’t be used anymore to
- * withdraw new coins.
- */
- struct GNUNET_TIME_Timestamp withdraw_valid_until;
-
- /**
- * Timestamp indicating when coins of this denomination become invalid.
- */
- struct GNUNET_TIME_Timestamp expire_deposit;
-
- /**
- * When do signatures with this denomination key become invalid?
- * After this point, these signatures cannot be used in (legal)
- * disputes anymore, as the Exchange is then allowed to destroy its side
- * of the evidence. @e expire_legal is expected to be significantly
- * larger than @e expire_deposit (by a year or more).
- */
- struct GNUNET_TIME_Timestamp expire_legal;
-
- /**
- * The value of this denomination
- */
- struct TALER_Amount value;
-
- /**
- * The applicable fees for this denomination
- */
- struct TALER_DenomFeeSet fees;
-
- /**
- * Set to true if the private denomination key has been
- * lost by the exchange and thus the key cannot be
- * used for withdrawing at this time.
- */
- bool lost;
-
- /**
- * Set to true if this denomination key has been
- * revoked by the exchange.
- */
- bool revoked;
-
-};
-
-
-/**
- * Information we track per denomination audited by the auditor.
- */
-struct TALER_EXCHANGE_AuditorDenominationInfo
-{
-
- /**
- * Signature by the auditor affirming that it is monitoring this
- * denomination.
- */
- struct TALER_AuditorSignatureP auditor_sig;
-
- /**
- * Offsets into the key's main `denom_keys` array identifying the
- * denomination being audited by this auditor.
- */
- unsigned int denom_key_offset;
-
-};
-
-
-/**
- * @brief Information we get from the exchange about auditors.
- */
-struct TALER_EXCHANGE_AuditorInformation
-{
- /**
- * Public key of the auditing institution. Wallets and merchants
- * are expected to be configured with a set of public keys of
- * auditors that they deem acceptable. These public keys are
- * the roots of the Taler PKI.
- */
- struct TALER_AuditorPublicKeyP auditor_pub;
-
- /**
- * URL of the auditing institution. Signed by the auditor's public
- * key, this URL is a place where applications can direct users for
- * additional information about the auditor. In the future, there
- * should also be an auditor API for automated submission about
- * claims of misbehaving exchange providers.
- */
- char *auditor_url;
-
- /**
- * Array of length @a num_denom_keys with the denomination
- * keys audited by this auditor.
- */
- struct TALER_EXCHANGE_AuditorDenominationInfo *denom_keys;
-
- /**
- * Number of denomination keys audited by this auditor.
- */
- unsigned int num_denom_keys;
-};
-
-
-/**
- * Global fees and options of an exchange for a given time period.
- */
-struct TALER_EXCHANGE_GlobalFee
-{
-
- /**
- * Signature affirming all of the data.
- */
- struct TALER_MasterSignatureP master_sig;
-
- /**
- * Starting time of the validity period (inclusive).
- */
- struct GNUNET_TIME_Timestamp start_date;
-
- /**
- * End time of the validity period (exclusive).
- */
- struct GNUNET_TIME_Timestamp end_date;
-
- /**
- * Unmerged purses will be timed out after at most this time.
- */
- struct GNUNET_TIME_Relative purse_timeout;
-
- /**
- * Account history is limited to this timeframe.
- */
- struct GNUNET_TIME_Relative history_expiration;
-
- /**
- * Fees that apply globally, independent of denomination
- * and wire method.
- */
- struct TALER_GlobalFeeSet fees;
-
- /**
- * Number of free purses per account.
- */
- uint32_t purse_account_limit;
-};
-
-
-/**
- * List sorted by @a start_date with fees to be paid for aggregate wire transfers.
- */
-struct TALER_EXCHANGE_WireAggregateFees
-{
- /**
- * This is a linked list.
- */
- struct TALER_EXCHANGE_WireAggregateFees *next;
-
- /**
- * Fee to be paid whenever the exchange wires funds to the merchant.
- */
- struct TALER_WireFeeSet fees;
-
- /**
- * Time when this fee goes into effect (inclusive)
- */
- struct GNUNET_TIME_Timestamp start_date;
-
- /**
- * Time when this fee stops being in effect (exclusive).
- */
- struct GNUNET_TIME_Timestamp end_date;
-
- /**
- * Signature affirming the above fee structure.
- */
- struct TALER_MasterSignatureP master_sig;
-};
-
-
-/**
- * Information about wire fees by wire method.
- */
-struct TALER_EXCHANGE_WireFeesByMethod
-{
- /**
- * Wire method with the given @e fees.
- */
- char *method;
-
- /**
- * Linked list of wire fees the exchange charges for
- * accounts of the wire @e method.
- */
- struct TALER_EXCHANGE_WireAggregateFees *fees_head;
-
-};
-
-
-/**
- * Type of an account restriction.
- */
-enum TALER_EXCHANGE_AccountRestrictionType
-{
- /**
- * Invalid restriction.
- */
- TALER_EXCHANGE_AR_INVALID = 0,
-
- /**
- * Account must not be used for this operation.
- */
- TALER_EXCHANGE_AR_DENY = 1,
-
- /**
- * Other account must match given regular expression.
- */
- TALER_EXCHANGE_AR_REGEX = 2
-};
-
-/**
- * Restrictions that apply to using a given exchange bank account.
- */
-struct TALER_EXCHANGE_AccountRestriction
-{
-
- /**
- * Type of the account restriction.
- */
- enum TALER_EXCHANGE_AccountRestrictionType type;
-
- /**
- * Restriction details depending on @e type.
- */
- union
- {
- /**
- * Details if type is #TALER_EXCHANGE_AR_REGEX.
- */
- struct
- {
- /**
- * Regular expression that the payto://-URI of the partner account must
- * follow. The regular expression should follow posix-egrep, but
- * without support for character classes, GNU extensions,
- * back-references or intervals. See
- * https://www.gnu.org/software/findutils/manual/html_node/find_html/posix_002degrep-regular-expression-syntax.html
- * for a description of the posix-egrep syntax. Applications may support
- * regexes with additional features, but exchanges must not use such
- * regexes.
- */
- char *posix_egrep;
-
- /**
- * Hint for a human to understand the restriction.
- */
- char *human_hint;
-
- /**
- * Internationalizations for the @e human_hint. Map from IETF BCP 47
- * language tax to localized human hints.
- */
- json_t *human_hint_i18n;
- } regex;
- } details;
-
-};
-
-
-/**
- * Information about a wire account of the exchange.
- */
-struct TALER_EXCHANGE_WireAccount
-{
- /**
- * payto://-URI of the exchange.
- */
- char *payto_uri;
-
- /**
- * URL of a conversion service in case using this account is subject to
- * currency conversion. NULL for no conversion needed.
- */
- char *conversion_url;
-
- /**
- * Array of restrictions that apply when crediting
- * this account.
- */
- struct TALER_EXCHANGE_AccountRestriction *credit_restrictions;
-
- /**
- * Array of restrictions that apply when debiting
- * this account.
- */
- struct TALER_EXCHANGE_AccountRestriction *debit_restrictions;
-
- /**
- * Length of the @e credit_restrictions array.
- */
- unsigned int credit_restrictions_length;
-
- /**
- * Length of the @e debit_restrictions array.
- */
- unsigned int debit_restrictions_length;
-
- /**
- * Signature of the exchange over the account (was checked by the API).
- */
- struct TALER_MasterSignatureP master_sig;
-
-};
-
-
-/**
- * @brief Information about keys from the exchange.
- */
-struct TALER_EXCHANGE_Keys
-{
-
- /**
- * Long-term offline signing key of the exchange.
- */
- struct TALER_MasterPublicKeyP master_pub;
-
- /**
- * Signature over extension configuration data, if any.
- */
- struct TALER_MasterSignatureP extensions_sig;
-
- /**
- * Array of the exchange's online signing keys.
- */
- struct TALER_EXCHANGE_SigningPublicKey *sign_keys;
-
- /**
- * Array of the exchange's denomination keys.
- */
- struct TALER_EXCHANGE_DenomPublicKey *denom_keys;
-
- /**
- * Array of the keys of the auditors of the exchange.
- */
- struct TALER_EXCHANGE_AuditorInformation *auditors;
-
- /**
- * Array with the global fees of the exchange.
- */
- struct TALER_EXCHANGE_GlobalFee *global_fees;
-
- /**
- * Configuration data for extensions.
- */
- json_t *extensions;
-
- /**
- * Supported Taler protocol version by the exchange.
- * String in the format current:revision:age using the
- * semantics of GNU libtool. See
- * https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
- */
- char *version;
-
- /**
- * Supported currency of the exchange.
- */
- char *currency;
-
- /**
- * What is the base URL of the exchange that returned
- * these keys?
- */
- char *exchange_url;
-
- /**
- * Asset type used by the exchange. Typical values
- * are "fiat" or "crypto" or "regional" or "stock".
- * Wallets should adjust their UI/UX based on this
- * value.
- */
- char *asset_type;
-
- /**
- * Array of amounts a wallet is allowed to hold from
- * this exchange before it must undergo further KYC checks.
- */
- struct TALER_Amount *wallet_balance_limit_without_kyc;
-
- /**
- * Array of accounts of the exchange.
- */
- struct TALER_EXCHANGE_WireAccount *accounts;
-
- /**
- * Array of wire fees by wire method.
- */
- struct TALER_EXCHANGE_WireFeesByMethod *fees;
-
- /**
- * How long after a reserve went idle will the exchange close it?
- * This is an approximate number, not cryptographically signed by
- * the exchange (advisory-only, may change anytime).
- */
- struct GNUNET_TIME_Relative reserve_closing_delay;
-
- /**
- * Timestamp indicating the /keys generation.
- */
- struct GNUNET_TIME_Timestamp list_issue_date;
-
- /**
- * When does this keys data expire?
- */
- struct GNUNET_TIME_Timestamp key_data_expiration;
-
- /**
- * Timestamp indicating the creation time of the last
- * denomination key in /keys.
- * Used to fetch /keys incrementally.
- */
- struct GNUNET_TIME_Timestamp last_denom_issue_date;
-
- /**
- * If age restriction is enabled on the exchange, we get an non-zero age_mask
- */
- struct TALER_AgeMask age_mask;
-
- /**
- * Absolute STEFAN parameter.
- */
- struct TALER_Amount stefan_abs;
-
- /**
- * Logarithmic STEFAN parameter.
- */
- struct TALER_Amount stefan_log;
-
- /**
- * Linear STEFAN parameter.
- */
- struct TALER_Amount stefan_lin;
-
- /**
- * Default number of fractional digits to render
- * amounts with.
- */
- uint32_t currency_fraction_digits;
-
- /**
- * Length of @e accounts array.
- */
- unsigned int accounts_len;
-
- /**
- * Length of @e fees array.
- */
- unsigned int fees_len;
-
- /**
- * Length of the @e wallet_balance_limit_without_kyc
- * array.
- */
- unsigned int wblwk_length;
-
- /**
- * Length of the @e global_fees array.
- */
- unsigned int num_global_fees;
-
- /**
- * Length of the @e sign_keys array (number of valid entries).
- */
- unsigned int num_sign_keys;
-
- /**
- * Length of the @e denom_keys array.
- */
- unsigned int num_denom_keys;
-
- /**
- * Length of the @e auditors array.
- */
- unsigned int num_auditors;
-
- /**
- * Actual length of the @e auditors array (size of allocation).
- */
- unsigned int auditors_size;
-
- /**
- * Actual length of the @e denom_keys array (size of allocation).
- */
- unsigned int denom_keys_size;
-
- /**
- * Reference counter for this structure.
- * Freed when it reaches 0.
- */
- unsigned int rc;
-
- /**
- * Set to true if rewards are allowed at this exchange.
- */
- bool rewards_allowed;
-};
-
-
-/**
- * How compatible are the protocol version of the exchange and this
- * client? The bits (1,2,4) can be used to test if the exchange's
- * version is incompatible, older or newer respectively.
- */
-enum TALER_EXCHANGE_VersionCompatibility
-{
-
- /**
- * The exchange runs exactly the same protocol version.
- */
- TALER_EXCHANGE_VC_MATCH = 0,
-
- /**
- * The exchange is too old or too new to be compatible with this
- * implementation (bit)
- */
- TALER_EXCHANGE_VC_INCOMPATIBLE = 1,
-
- /**
- * The exchange is older than this implementation (bit)
- */
- TALER_EXCHANGE_VC_OLDER = 2,
-
- /**
- * The exchange is too old to be compatible with
- * this implementation.
- */
- TALER_EXCHANGE_VC_INCOMPATIBLE_OUTDATED
- = TALER_EXCHANGE_VC_INCOMPATIBLE
- | TALER_EXCHANGE_VC_OLDER,
-
- /**
- * The exchange is more recent than this implementation (bit).
- */
- TALER_EXCHANGE_VC_NEWER = 4,
-
- /**
- * The exchange is too recent for this implementation.
- */
- TALER_EXCHANGE_VC_INCOMPATIBLE_NEWER
- = TALER_EXCHANGE_VC_INCOMPATIBLE
- | TALER_EXCHANGE_VC_NEWER,
-
- /**
- * We could not even parse the version data.
- */
- TALER_EXCHANGE_VC_PROTOCOL_ERROR = 8
-
-};
-
-
-/**
- * General information about the HTTP response we obtained
- * from the exchange for a request.
- */
-struct TALER_EXCHANGE_HttpResponse
-{
-
- /**
- * The complete JSON reply. NULL if we failed to parse the
- * reply (too big, invalid JSON).
- */
- const json_t *reply;
-
- /**
- * Set to the human-readable 'hint' that is optionally
- * provided by the exchange together with errors. NULL
- * if no hint was provided or if there was no error.
- */
- const char *hint;
-
- /**
- * HTTP status code for the response. 0 if the
- * HTTP request failed and we did not get any answer, or
- * if the answer was invalid and we set @a ec to a
- * client-side error code.
- */
- unsigned int http_status;
-
- /**
- * Taler error code. #TALER_EC_NONE if everything was
- * OK. Usually set to the "code" field of an error
- * response, but may be set to values created at the
- * client side, for example when the response was
- * not in JSON format or was otherwise ill-formed.
- */
- enum TALER_ErrorCode ec;
-
-};
-
-
-/**
- * Response from /keys.
- */
-struct TALER_EXCHANGE_KeysResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP status code.
- */
- union
- {
-
- /**
- * Details on #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Information about the various keys used by the exchange.
- */
- const struct TALER_EXCHANGE_Keys *keys;
-
- /**
- * Protocol compatibility information
- */
- enum TALER_EXCHANGE_VersionCompatibility compat;
- } ok;
- } details;
-
-};
-
-
-/**
- * Function called with information about who is auditing
- * a particular exchange and what keys the exchange is using.
- * The ownership over the @a keys object is passed to
- * the callee, thus it is given explicitly and not
- * (only) via @a kr.
- *
- * @param cls closure
- * @param kr response from /keys
- * @param[in] keys keys object passed to callback with
- * reference counter of 1. Must be freed by callee
- * using #TALER_EXCHANGE_keys_decref(). NULL on failure.
- */
-typedef void
-(*TALER_EXCHANGE_GetKeysCallback) (
- void *cls,
- const struct TALER_EXCHANGE_KeysResponse *kr,
- struct TALER_EXCHANGE_Keys *keys);
-
-
-/**
- * @brief Handle for a GET /keys request.
- */
-struct TALER_EXCHANGE_GetKeysHandle;
-
-
-/**
- * Fetch the main /keys resources from an exchange. Does an incremental
- * fetch if @a last_keys is given. The obtained information will be passed to
- * the @a cert_cb (possibly after first merging it with @a last_keys to
- * produce a full picture; expired keys (for deposit) will be removed from @a
- * last_keys if there are any).
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param[in,out] last_keys previous keys object, NULL for none
- * @param cert_cb function to call with the exchange's certification information,
- * possibly called repeatedly if the information changes
- * @param cert_cb_cls closure for @a cert_cb
- * @return the exchange handle; NULL upon error
- */
-struct TALER_EXCHANGE_GetKeysHandle *
-TALER_EXCHANGE_get_keys (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *last_keys,
- TALER_EXCHANGE_GetKeysCallback cert_cb,
- void *cert_cb_cls);
-
-
-/**
- * Serialize the latest data from @a keys to be persisted
- * (for example, to be used as @a last_keys later).
- *
- * @param kd the key data to serialize
- * @return NULL on error; otherwise JSON object owned by the caller
- */
-json_t *
-TALER_EXCHANGE_keys_to_json (const struct TALER_EXCHANGE_Keys *kd);
-
-
-/**
- * Deserialize keys data stored in @a j.
- *
- * @param j JSON keys data previously returned from #TALER_EXCHANGE_keys_to_json()
- * @return NULL on error (i.e. invalid JSON); otherwise
- * keys object with reference counter 1 owned by the caller
- */
-struct TALER_EXCHANGE_Keys *
-TALER_EXCHANGE_keys_from_json (const json_t *j);
-
-
-/**
- * Cancel GET /keys operation.
- *
- * @param[in] gkh the GET /keys handle
- */
-void
-TALER_EXCHANGE_get_keys_cancel (struct TALER_EXCHANGE_GetKeysHandle *gkh);
-
-
-/**
- * Increment reference counter for @a keys
- *
- * @param[in,out] keys object to increment reference counter for
- * @return keys, with incremented reference counter
- */
-struct TALER_EXCHANGE_Keys *
-TALER_EXCHANGE_keys_incref (struct TALER_EXCHANGE_Keys *keys);
-
-
-/**
- * Deccrement reference counter for @a keys.
- * Frees @a keys if reference counter becomes zero.
- *
- * @param[in,out] keys object to decrement reference counter for
- */
-void
-TALER_EXCHANGE_keys_decref (struct TALER_EXCHANGE_Keys *keys);
-
-
-/**
- * Use STEFAN curve in @a keys to convert @a brut to @a net. Computes the
- * expected minimum (!) @a net amount that should for sure arrive in the
- * target amount at cost of @a brut to the wallet. Note that STEFAN curves by
- * design over-estimate actual fees and a wallet may be able to achieve the
- * same @a net amount with less fees --- or if the available coins are
- * abnormal in structure, it may take more.
- *
- * @param keys exchange key data
- * @param brut gross amount (actual cost including fees)
- * @param[out] net net amount (effective amount)
- * @return #GNUNET_OK on success, #GNUNET_NO if the
- * resulting @a net is zero (or lower)
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGE_keys_stefan_b2n (
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_Amount *brut,
- struct TALER_Amount *net);
-
-
-/**
- * Use STEFAN curve in @a keys to convert @a net to @a brut. Computes the
- * expected maximum (!) @a brut amount that should be needed in the wallet to
- * transfer @a net amount to the target account. Note that STEFAN curves by
- * design over-estimate actual fees and a wallet may be able to achieve the
- * same @a net amount with less fees --- or if the available coins are
- * abnormal in structure, it may take more.
- *
- * @param keys exchange key data
- * @param net net amount (effective amount)
- * @param[out] brut gross amount (actual cost including fees)
- * @return #GNUNET_OK on success, #GNUNET_NO if the
- * resulting @a brut is zero (only if @a net was zero)
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGE_keys_stefan_n2b (
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_Amount *net,
- struct TALER_Amount *brut);
-
-
-/**
- * Round brutto or netto value computed via STEFAN
- * curve to decimal places commonly used at the exchange.
- *
- * @param keys exchange keys response data
- * @param[in,out] val value to round
- */
-void
-TALER_EXCHANGE_keys_stefan_round (
- const struct TALER_EXCHANGE_Keys *keys,
- struct TALER_Amount *val);
-
-
-/**
- * Test if the given @a pub is a the current signing key from the exchange
- * according to @a keys.
- *
- * @param keys the exchange's key set
- * @param pub claimed current online signing key for the exchange
- * @return #GNUNET_OK if @a pub is (according to /keys) a current signing key
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGE_test_signing_key (
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ExchangePublicKeyP *pub);
-
-
-/**
- * Obtain the denomination key details from the exchange.
- *
- * @param keys the exchange's key set
- * @param pk public key of the denomination to lookup
- * @return details about the given denomination key, NULL if the key is not
- * found
- */
-const struct TALER_EXCHANGE_DenomPublicKey *
-TALER_EXCHANGE_get_denomination_key (
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_DenominationPublicKey *pk);
-
-
-/**
- * Obtain the global fee details from the exchange.
- *
- * @param keys the exchange's key set
- * @param ts time for when to fetch the fees
- * @return details about the fees, NULL if no fees are known at @a ts
- */
-const struct TALER_EXCHANGE_GlobalFee *
-TALER_EXCHANGE_get_global_fee (
- const struct TALER_EXCHANGE_Keys *keys,
- struct GNUNET_TIME_Timestamp ts);
-
-
-/**
- * Create a copy of a denomination public key.
- *
- * @param key key to copy
- * @returns a copy, must be freed with #TALER_EXCHANGE_destroy_denomination_key()
- * @deprecated
- */
-struct TALER_EXCHANGE_DenomPublicKey *
-TALER_EXCHANGE_copy_denomination_key (
- const struct TALER_EXCHANGE_DenomPublicKey *key);
-
-
-/**
- * Destroy a denomination public key.
- * Should only be called with keys created by #TALER_EXCHANGE_copy_denomination_key().
- *
- * @param key key to destroy.
- * @deprecated
- */
-void
-TALER_EXCHANGE_destroy_denomination_key (
- struct TALER_EXCHANGE_DenomPublicKey *key);
-
-
-/**
- * Obtain the denomination key details from the exchange.
- *
- * @param keys the exchange's key set
- * @param hc hash of the public key of the denomination to lookup
- * @return details about the given denomination key
- */
-const struct TALER_EXCHANGE_DenomPublicKey *
-TALER_EXCHANGE_get_denomination_key_by_hash (
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_DenominationHashP *hc);
-
-
-/**
- * Obtain meta data about an exchange (online) signing
- * key.
- *
- * @param keys from where to obtain the meta data
- * @param exchange_pub public key to lookup
- * @return NULL on error (@a exchange_pub not known)
- */
-const struct TALER_EXCHANGE_SigningPublicKey *
-TALER_EXCHANGE_get_signing_key_info (
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ExchangePublicKeyP *exchange_pub);
-
-
-/* ********************* wire helpers *********************** */
-
-
-/**
- * Parse array of @a accounts of the exchange into @a was.
- *
- * @param master_pub master public key of the exchange, NULL to not verify signatures
- * @param accounts array of accounts to parse
- * @param[out] was where to write the result (already allocated)
- * @param was_length length of the @a was array, must match the length of @a accounts
- * @return #GNUNET_OK if parsing @a accounts succeeded
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGE_parse_accounts (
- const struct TALER_MasterPublicKeyP *master_pub,
- const json_t *accounts,
- unsigned int was_length,
- struct TALER_EXCHANGE_WireAccount was[static was_length]);
-
-
-/**
- * Free data within @a was, but not @a was itself.
- *
- * @param was array of wire account data
- * @param was_len length of the @a was array
- */
-void
-TALER_EXCHANGE_free_accounts (
- unsigned int was_len,
- struct TALER_EXCHANGE_WireAccount was[static was_len]);
-
-
-/* ********************* /coins/$COIN_PUB/deposit *********************** */
-
-
-/**
- * Information needed for a coin to be deposited.
- */
-struct TALER_EXCHANGE_CoinDepositDetail
-{
-
- /**
- * The amount to be deposited.
- */
- struct TALER_Amount amount;
-
- /**
- * Hash over the age commitment of the coin.
- */
- struct TALER_AgeCommitmentHash h_age_commitment;
-
- /**
- * The coin’s public key.
- */
- struct TALER_CoinSpendPublicKeyP coin_pub;
-
- /**
- * The signature made with purpose #TALER_SIGNATURE_WALLET_COIN_DEPOSIT made
- * by the customer with the coin’s private key.
- */
- struct TALER_CoinSpendSignatureP coin_sig;
-
- /**
- * Exchange’s unblinded signature of the coin.
- */
- struct TALER_DenominationSignature denom_sig;
-
- /**
- * Hash of the public key of the coin.
- */
- struct TALER_DenominationHashP h_denom_pub;
-};
-
-
-/**
- * Meta information about the contract relevant for a coin's deposit
- * operation.
- */
-struct TALER_EXCHANGE_DepositContractDetail
-{
-
- /**
- * Hash of the contact of the merchant with the customer (further details
- * are never disclosed to the exchange)
- */
- struct TALER_PrivateContractHashP h_contract_terms;
-
- /**
- * The public key of the merchant (used to identify the merchant for refund
- * requests).
- */
- struct TALER_MerchantPublicKeyP merchant_pub;
-
- /**
- * Salt used to hash the @e merchant_payto_uri.
- */
- struct TALER_WireSaltP wire_salt;
-
- /**
- * Hash over data provided by the wallet to customize the contract.
- * All zero if not used.
- */
- struct GNUNET_HashCode wallet_data_hash;
-
- /**
- * Date until which the merchant can issue a refund to the customer via the
- * exchange (can be zero if refunds are not allowed); must not be after the
- * @e wire_deadline.
- */
- struct GNUNET_TIME_Timestamp refund_deadline;
-
- /**
- * Execution date, until which the merchant would like the exchange to
- * settle the balance (advisory, the exchange cannot be forced to settle in
- * the past or upon very short notice, but of course a well-behaved exchange
- * will limit aggregation based on the advice received).
- */
- struct GNUNET_TIME_Timestamp wire_deadline;
-
- /**
- * Timestamp when the contract was finalized, must match approximately the
- * current time of the exchange.
- */
- struct GNUNET_TIME_Timestamp wallet_timestamp;
-
- /**
- * The merchant’s account details, in the payto://-format supported by the
- * exchange.
- */
- const char *merchant_payto_uri;
-
- /**
- * Policy extension specific details about the deposit relevant to the exchange.
- */
- const json_t *policy_details;
-
-};
-
-
-/**
- * @brief A Batch Deposit Handle
- */
-struct TALER_EXCHANGE_BatchDepositHandle;
-
-
-/**
- * Structure with information about a batch deposit
- * operation's result.
- */
-struct TALER_EXCHANGE_BatchDepositResult
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- union
- {
-
- /**
- * Information returned if the HTTP status is
- * #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Time when the exchange generated the batch deposit confirmation
- */
- struct GNUNET_TIME_Timestamp deposit_timestamp;
-
- /**
- * Array of signatures provided by the exchange
- */
- const struct TALER_ExchangeSignatureP *exchange_sigs;
-
- /**
- * exchange key used to sign @a exchange_sig.
- */
- const struct TALER_ExchangePublicKeyP *exchange_pub;
-
- /**
- * Base URL for looking up wire transfers, or
- * NULL to use the default base URL.
- */
- const char *transaction_base_url;
-
- /**
- * Length of the @e exchange_sigs array.
- */
- unsigned int num_signatures;
-
- } ok;
-
- /**
- * Information returned if the HTTP status is
- * #MHD_HTTP_CONFLICT.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } conflict;
-
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * deposit permission request to a exchange.
- *
- * @param cls closure
- * @param dr deposit response details
- */
-typedef void
-(*TALER_EXCHANGE_BatchDepositResultCallback) (
- void *cls,
- const struct TALER_EXCHANGE_BatchDepositResult *dr);
-
-
-/**
- * Submit a batch of deposit permissions to the exchange and get the
- * exchange's response. This API is typically used by a merchant. Note that
- * while we return the response verbatim to the caller for further processing,
- * we do already verify that the response is well-formed (i.e. that signatures
- * included in the response are all valid). If the exchange's reply is not
- * well-formed, we return an HTTP status code of zero to @a cb.
- *
- * We also verify that the @a cdds.coin_sig are valid for this deposit
- * request, and that the @a cdds.ub_sig are a valid signatures for @a
- * coin_pub. Also, the @a exchange must be ready to operate (i.e. have
- * finished processing the /keys reply). If either check fails, we do
- * NOT initiate the transaction with the exchange and instead return NULL.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param dcd details about the contract the deposit is for
- * @param num_cdds length of the @a cdds array
- * @param cdds array with details about the coins to be deposited
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @param[out] ec if NULL is returned, set to the error code explaining why the operation failed
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_BatchDepositHandle *
-TALER_EXCHANGE_batch_deposit (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_EXCHANGE_DepositContractDetail *dcd,
- unsigned int num_cdds,
- const struct TALER_EXCHANGE_CoinDepositDetail cdds[static num_cdds],
- TALER_EXCHANGE_BatchDepositResultCallback cb,
- void *cb_cls,
- enum TALER_ErrorCode *ec);
-
-
-/**
- * Change the chance that our deposit confirmation will be given to the
- * auditor to 100%.
- *
- * @param[in,out] deposit the batch deposit permission request handle
- */
-void
-TALER_EXCHANGE_batch_deposit_force_dc (
- struct TALER_EXCHANGE_BatchDepositHandle *deposit);
-
-
-/**
- * Cancel a batch deposit permission request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param[in] deposit the deposit permission request handle
- */
-void
-TALER_EXCHANGE_batch_deposit_cancel (
- struct TALER_EXCHANGE_BatchDepositHandle *deposit);
-
-
-/* ********************* /coins/$COIN_PUB/refund *********************** */
-
-/**
- * @brief A Refund Handle
- */
-struct TALER_EXCHANGE_RefundHandle;
-
-/**
- * Response from the /refund API.
- */
-struct TALER_EXCHANGE_RefundResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status code.
- */
- union
- {
- /**
- * Details on #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Exchange key used to sign.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * The actual signature
- */
- struct TALER_ExchangeSignatureP exchange_sig;
- } ok;
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * refund request to an exchange.
- *
- * @param cls closure
- * @param rr refund response
- */
-typedef void
-(*TALER_EXCHANGE_RefundCallback) (
- void *cls,
- const struct TALER_EXCHANGE_RefundResponse *rr);
-
-/**
- * Submit a refund request to the exchange and get the exchange's response.
- * This API is used by a merchant. Note that while we return the response
- * verbatim to the caller for further processing, we do already verify that
- * the response is well-formed (i.e. that signatures included in the response
- * are all valid). If the exchange's reply is not well-formed, we return an
- * HTTP status code of zero to @a cb.
- *
- * The @a exchange must be ready to operate (i.e. have
- * finished processing the /keys reply). If this check fails, we do
- * NOT initiate the transaction with the exchange and instead return NULL.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param amount the amount to be refunded; must be larger than the refund fee
- * (as that fee is still being subtracted), and smaller than the amount
- * (with deposit fee) of the original deposit contribution of this coin
- * @param h_contract_terms hash of the contact of the merchant with the customer that is being refunded
- * @param coin_pub coin’s public key of the coin from the original deposit operation
- * @param rtransaction_id transaction id for the transaction between merchant and customer (of refunding operation);
- * this is needed as we may first do a partial refund and later a full refund. If both
- * refunds are also over the same amount, we need the @a rtransaction_id to make the disjoint
- * refund requests different (as requests are idempotent and otherwise the 2nd refund might not work).
- * @param merchant_priv the private key of the merchant, used to generate signature for refund request
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_RefundHandle *
-TALER_EXCHANGE_refund (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_Amount *amount,
- const struct TALER_PrivateContractHashP *h_contract_terms,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
- uint64_t rtransaction_id,
- const struct TALER_MerchantPrivateKeyP *merchant_priv,
- TALER_EXCHANGE_RefundCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a refund permission request. This function cannot be used
- * on a request handle if a response is already served for it. If
- * this function is called, the refund may or may not have happened.
- * However, it is fine to try to refund the coin a second time.
- *
- * @param refund the refund request handle
- */
-void
-TALER_EXCHANGE_refund_cancel (struct TALER_EXCHANGE_RefundHandle *refund);
-
-
-/* ********************* POST /csr-melt *********************** */
-
-
-/**
- * @brief A /csr-melt Handle
- */
-struct TALER_EXCHANGE_CsRMeltHandle;
-
-
-/**
- * Details about a response for a CS R request.
- */
-struct TALER_EXCHANGE_CsRMeltResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response.
- */
- union
- {
- /**
- * Details if the status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Length of the @e alg_values array.
- */
- unsigned int alg_values_len;
-
- /**
- * Values contributed by the exchange for the
- * respective coin's withdraw operation.
- */
- const struct TALER_ExchangeWithdrawValues *alg_values;
- } ok;
-
- /**
- * Details if the status is #MHD_HTTP_GONE.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } gone;
-
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * CS R request to a exchange.
- *
- * @param cls closure
- * @param csrr response details
- */
-typedef void
-(*TALER_EXCHANGE_CsRMeltCallback) (
- void *cls,
- const struct TALER_EXCHANGE_CsRMeltResponse *csrr);
-
-
-/**
- * Information we pass per coin to a /csr-melt request.
- */
-struct TALER_EXCHANGE_NonceKey
-{
- /**
- * Which denomination key is the /csr-melt request for?
- */
- const struct TALER_EXCHANGE_DenomPublicKey *pk;
-
- /**
- * What is number to derive the client nonce for the
- * fresh coin?
- */
- uint32_t cnc_num;
-};
-
-
-/**
- * Get a set of CS R values using a /csr-melt request.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param rms master key used for the derivation of the CS values
- * @param nks_len length of the @a nks array
- * @param nks array of denominations and nonces
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for the above callback
- * @return handle for the operation on success, NULL on error, i.e.
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_CsRMeltHandle *
-TALER_EXCHANGE_csr_melt (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_RefreshMasterSecretP *rms,
- unsigned int nks_len,
- struct TALER_EXCHANGE_NonceKey nks[static nks_len],
- TALER_EXCHANGE_CsRMeltCallback res_cb,
- void *res_cb_cls);
-
-
-/**
- *
- * Cancel a CS R melt request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param csrh the withdraw handle
- */
-void
-TALER_EXCHANGE_csr_melt_cancel (struct TALER_EXCHANGE_CsRMeltHandle *csrh);
-
-
-/* ********************* POST /csr-withdraw *********************** */
-
-
-/**
- * @brief A /csr-withdraw Handle
- */
-struct TALER_EXCHANGE_CsRWithdrawHandle;
-
-
-/**
- * Details about a response for a CS R request.
- */
-struct TALER_EXCHANGE_CsRWithdrawResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response.
- */
- union
- {
- /**
- * Details if the status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Values contributed by the exchange for the
- * respective coin's withdraw operation.
- */
- struct TALER_ExchangeWithdrawValues alg_values;
- } ok;
-
- /**
- * Details if the status is #MHD_HTTP_GONE.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } gone;
-
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * CS R withdraw request to a exchange.
- *
- * @param cls closure
- * @param csrr response details
- */
-typedef void
-(*TALER_EXCHANGE_CsRWithdrawCallback) (
- void *cls,
- const struct TALER_EXCHANGE_CsRWithdrawResponse *csrr);
-
-
-/**
- * Get a CS R using a /csr-withdraw request.
- *
- * @param curl_ctx The curl context to use for the requests
- * @param exchange_url Base-URL to the excnange
- * @param pk Which denomination key is the /csr request for
- * @param nonce client nonce for the request
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for the above callback
- * @return handle for the operation on success, NULL on error, i.e.
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_CsRWithdrawHandle *
-TALER_EXCHANGE_csr_withdraw (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *exchange_url,
- const struct TALER_EXCHANGE_DenomPublicKey *pk,
- const struct TALER_CsNonce *nonce,
- TALER_EXCHANGE_CsRWithdrawCallback res_cb,
- void *res_cb_cls);
-
-
-/**
- *
- * Cancel a CS R withdraw request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param csrh the withdraw handle
- */
-void
-TALER_EXCHANGE_csr_withdraw_cancel (
- struct TALER_EXCHANGE_CsRWithdrawHandle *csrh);
-
-
-/* ********************* GET /reserves/$RESERVE_PUB *********************** */
-
-/**
- * Ways how a reserve's balance may change.
- */
-enum TALER_EXCHANGE_ReserveTransactionType
-{
-
- /**
- * Deposit into the reserve.
- */
- TALER_EXCHANGE_RTT_CREDIT,
-
- /**
- * Withdrawal from the reserve.
- */
- TALER_EXCHANGE_RTT_WITHDRAWAL,
-
- /**
- * Age-Withdrawal from the reserve.
- */
- TALER_EXCHANGE_RTT_AGEWITHDRAWAL,
-
- /**
- * /recoup operation.
- */
- TALER_EXCHANGE_RTT_RECOUP,
-
- /**
- * Reserve closed operation.
- */
- TALER_EXCHANGE_RTT_CLOSING,
-
- /**
- * Reserve history request.
- */
- TALER_EXCHANGE_RTT_HISTORY,
-
- /**
- * Reserve purse merge operation.
- */
- TALER_EXCHANGE_RTT_MERGE,
-
- /**
- * Reserve open request operation.
- */
- TALER_EXCHANGE_RTT_OPEN,
-
- /**
- * Reserve close request operation.
- */
- TALER_EXCHANGE_RTT_CLOSE
-
-};
-
-
-/**
- * @brief Entry in the reserve's transaction history.
- */
-struct TALER_EXCHANGE_ReserveHistoryEntry
-{
-
- /**
- * Type of the transaction.
- */
- enum TALER_EXCHANGE_ReserveTransactionType type;
-
- /**
- * Amount transferred (in or out).
- */
- struct TALER_Amount amount;
-
- /**
- * Details depending on @e type.
- */
- union
- {
-
- /**
- * Information about a deposit that filled this reserve.
- * @e type is #TALER_EXCHANGE_RTT_CREDIT.
- */
- struct
- {
- /**
- * Sender account payto://-URL of the incoming transfer.
- */
- char *sender_url;
-
- /**
- * Information that uniquely identifies the wire transfer.
- */
- uint64_t wire_reference;
-
- /**
- * When did the wire transfer happen?
- */
- struct GNUNET_TIME_Timestamp timestamp;
-
- } in_details;
-
- /**
- * Information about withdraw operation.
- * @e type is #TALER_EXCHANGE_RTT_WITHDRAWAL.
- */
- struct
- {
- /**
- * Signature authorizing the withdrawal for outgoing transaction.
- */
- json_t *out_authorization_sig;
-
- /**
- * Fee that was charged for the withdrawal.
- */
- struct TALER_Amount fee;
- } withdraw;
-
- /**
- * Information about withdraw operation.
- * @e type is #TALER_EXCHANGE_RTT_AGEWITHDRAWAL.
- */
- struct
- {
- /**
- * Signature authorizing the withdrawal for outgoing transaction.
- */
- json_t *out_authorization_sig;
-
- /**
- * Maximum age committed
- */
- uint8_t max_age;
-
- /**
- * Fee that was charged for the withdrawal.
- */
- struct TALER_Amount fee;
- } age_withdraw;
-
- /**
- * Information provided if the reserve was filled via /recoup.
- * @e type is #TALER_EXCHANGE_RTT_RECOUP.
- */
- struct
- {
-
- /**
- * Public key of the coin that was paid back.
- */
- struct TALER_CoinSpendPublicKeyP coin_pub;
-
- /**
- * Signature of the coin of type
- * #TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP.
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * Public key of the exchange that was used for @e exchange_sig.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * When did the /recoup operation happen?
- */
- struct GNUNET_TIME_Timestamp timestamp;
-
- } recoup_details;
-
- /**
- * Information about a close operation of the reserve.
- * @e type is #TALER_EXCHANGE_RTT_CLOSE.
- */
- struct
- {
- /**
- * Receiver account information for the outgoing wire transfer.
- */
- const char *receiver_account_details;
-
- /**
- * Wire transfer details for the outgoing wire transfer.
- */
- struct TALER_WireTransferIdentifierRawP wtid;
-
- /**
- * Signature of the coin of type
- * #TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED.
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * Public key of the exchange that was used for @e exchange_sig.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * When did the wire transfer happen?
- */
- struct GNUNET_TIME_Timestamp timestamp;
-
- /**
- * Fee that was charged for the closing.
- */
- struct TALER_Amount fee;
-
- } close_details;
-
- /**
- * Information about a history operation of the reserve.
- * @e type is #TALER_EXCHANGE_RTT_HISTORY.
- */
- struct
- {
-
- /**
- * When was the request made.
- */
- struct GNUNET_TIME_Timestamp request_timestamp;
-
- /**
- * Signature by the reserve approving the history request.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- } history_details;
-
- /**
- * Information about a merge operation on the reserve.
- * @e type is #TALER_EXCHANGE_RTT_MERGE.
- */
- struct
- {
-
- /**
- * Fee paid for the purse.
- */
- struct TALER_Amount purse_fee;
-
- /**
- * Hash over the contract.
- */
- struct TALER_PrivateContractHashP h_contract_terms;
-
- /**
- * Merge capability key.
- */
- struct TALER_PurseMergePublicKeyP merge_pub;
-
- /**
- * Purse public key.
- */
- struct TALER_PurseContractPublicKeyP purse_pub;
-
- /**
- * Signature by the reserve approving the merge.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * When was the merge made.
- */
- struct GNUNET_TIME_Timestamp merge_timestamp;
-
- /**
- * When was the purse set to expire.
- */
- struct GNUNET_TIME_Timestamp purse_expiration;
-
- /**
- * Minimum age required for depositing into the purse.
- */
- uint32_t min_age;
-
- /**
- * Flags of the purse.
- */
- enum TALER_WalletAccountMergeFlags flags;
-
- /**
- * True if the purse was actually merged, false
- * if only the @e purse_fee was charged.
- */
- bool merged;
-
- } merge_details;
-
- /**
- * Information about an open request operation on the reserve.
- * @e type is #TALER_EXCHANGE_RTT_OPEN.
- */
- struct
- {
-
- /**
- * Signature by the reserve approving the open.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * Amount to be paid from the reserve balance to open
- * the reserve.
- */
- struct TALER_Amount reserve_payment;
-
- /**
- * When was the request created.
- */
- struct GNUNET_TIME_Timestamp request_timestamp;
-
- /**
- * For how long should the reserve be kept open.
- * (Determines amount to be paid.)
- */
- struct GNUNET_TIME_Timestamp reserve_expiration;
-
- /**
- * How many open purses should be included with the
- * open reserve?
- * (Determines amount to be paid.)
- */
- uint32_t purse_limit;
-
- } open_request;
-
- /**
- * Information about an close request operation on the reserve.
- * @e type is #TALER_EXCHANGE_RTT_CLOSE.
- */
- struct
- {
-
- /**
- * Signature by the reserve approving the close.
- */
- struct TALER_ReserveSignatureP reserve_sig;
-
- /**
- * When was the request created.
- */
- struct GNUNET_TIME_Timestamp request_timestamp;
-
- /**
- * Hash of the payto://-URI of the target account
- * for the closure, or all zeros for the reserve
- * origin account.
- */
- struct TALER_PaytoHashP target_account_h_payto;
-
- } close_request;
-
-
- } details;
-
-};
-
-
-/**
- * @brief A /reserves/ GET Handle
- */
-struct TALER_EXCHANGE_ReservesGetHandle;
-
-
-/**
- * @brief Reserve summary.
- */
-struct TALER_EXCHANGE_ReserveSummary
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
-
- /**
- * Reserve balance.
- */
- struct TALER_Amount balance;
-
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve status request to a exchange.
- *
- * @param cls closure
- * @param rs HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesGetCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReserveSummary *rs);
-
-
-/**
- * Submit a request to obtain the transaction history of a reserve
- * from the exchange. Note that while we return the full response to the
- * caller for further processing, we do already verify that the
- * response is well-formed (i.e. that signatures included in the
- * response are all valid and add up to the balance). If the exchange's
- * reply is not well-formed, we return an HTTP status code of zero to
- * @a cb.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param reserve_pub public key of the reserve to inspect
- * @param timeout how long to wait for an affirmative reply
- * (enables long polling if the reserve does not yet exist)
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesGetHandle *
-TALER_EXCHANGE_reserves_get (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- struct GNUNET_TIME_Relative timeout,
- TALER_EXCHANGE_ReservesGetCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a reserve GET request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param rgh the reserve request handle
- */
-void
-TALER_EXCHANGE_reserves_get_cancel (
- struct TALER_EXCHANGE_ReservesGetHandle *rgh);
-
-
-/**
- * @brief A /reserves/$RID/status Handle
- */
-struct TALER_EXCHANGE_ReservesStatusHandle;
-
-
-/**
- * @brief Reserve status details.
- */
-struct TALER_EXCHANGE_ReserveStatus
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
-
- /**
- * Current reserve balance. May not be the difference between
- * @e total_in and @e total_out because the @e may be truncated.
- */
- struct TALER_Amount balance;
-
- /**
- * Total of all inbound transactions in @e history.
- */
- struct TALER_Amount total_in;
-
- /**
- * Total of all outbound transactions in @e history.
- */
- struct TALER_Amount total_out;
-
- /**
- * Reserve history.
- */
- const struct TALER_EXCHANGE_ReserveHistoryEntry *history;
-
- /**
- * Length of the @e history array.
- */
- unsigned int history_len;
-
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve status request to a exchange.
- *
- * @param cls closure
- * @param rs HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesStatusCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReserveStatus *rs);
-
-
-/**
- * Submit a request to obtain the reserve status.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param reserve_priv private key of the reserve to inspect
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesStatusHandle *
-TALER_EXCHANGE_reserves_status (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- TALER_EXCHANGE_ReservesStatusCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a reserve status request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param rsh the reserve request handle
- */
-void
-TALER_EXCHANGE_reserves_status_cancel (
- struct TALER_EXCHANGE_ReservesStatusHandle *rsh);
-
-
-/**
- * @brief A /reserves/$RID/history Handle
- */
-struct TALER_EXCHANGE_ReservesHistoryHandle;
-
-
-/**
- * @brief Reserve history details.
- */
-struct TALER_EXCHANGE_ReserveHistory
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Timestamp of when we made the history request
- * (client-side).
- */
- struct GNUNET_TIME_Timestamp ts;
-
- /**
- * Reserve signature affirming the history request
- * (generated as part of the request).
- */
- const struct TALER_ReserveSignatureP *reserve_sig;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
-
- /**
- * Reserve balance. May not be the difference between
- * @e total_in and @e total_out because the @e may be truncated
- * due to expiration.
- */
- struct TALER_Amount balance;
-
- /**
- * Total of all inbound transactions in @e history.
- */
- struct TALER_Amount total_in;
-
- /**
- * Total of all outbound transactions in @e history.
- */
- struct TALER_Amount total_out;
-
- /**
- * Reserve history.
- */
- const struct TALER_EXCHANGE_ReserveHistoryEntry *history;
-
- /**
- * Length of the @e history array.
- */
- unsigned int history_len;
-
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve history request to a exchange.
- *
- * @param cls closure
- * @param rs HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesHistoryCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReserveHistory *rs);
-
-
-/**
- * Submit a request to obtain the reserve history.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param reserve_priv private key of the reserve to inspect
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesHistoryHandle *
-TALER_EXCHANGE_reserves_history (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- TALER_EXCHANGE_ReservesHistoryCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a reserve history request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param rsh the reserve request handle
- */
-void
-TALER_EXCHANGE_reserves_history_cancel (
- struct TALER_EXCHANGE_ReservesHistoryHandle *rsh);
-
-
-/* ********************* POST /reserves/$RESERVE_PUB/withdraw *********************** */
-
-
-/**
- * @brief A /reserves/$RESERVE_PUB/withdraw Handle
- */
-struct TALER_EXCHANGE_WithdrawHandle;
-
-
-/**
- * Information input into the withdraw process per coin.
- */
-struct TALER_EXCHANGE_WithdrawCoinInput
-{
- /**
- * Denomination of the coin.
- */
- const struct TALER_EXCHANGE_DenomPublicKey *pk;
-
- /**
- * Master key material for the coin.
- */
- const struct TALER_PlanchetMasterSecretP *ps;
-
- /**
- * Age commitment for the coin.
- */
- const struct TALER_AgeCommitmentHash *ach;
-
-};
-
-
-/**
- * All the details about a coin that are generated during withdrawal and that
- * may be needed for future operations on the coin.
- */
-struct TALER_EXCHANGE_PrivateCoinDetails
-{
- /**
- * Private key of the coin.
- */
- struct TALER_CoinSpendPrivateKeyP coin_priv;
-
- /**
- * Value used to blind the key for the signature.
- * Needed for recoup operations.
- */
- union TALER_DenominationBlindingKeyP bks;
-
- /**
- * Signature over the coin.
- */
- struct TALER_DenominationSignature sig;
-
- /**
- * Values contributed from the exchange during the
- * withdraw protocol.
- */
- struct TALER_ExchangeWithdrawValues exchange_vals;
-};
-
-
-/**
- * Details about a response for a withdraw request.
- */
-struct TALER_EXCHANGE_WithdrawResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response.
- */
- union
- {
- /**
- * Details if the status is #MHD_HTTP_OK.
- */
- struct TALER_EXCHANGE_PrivateCoinDetails ok;
-
- /**
- * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
- /**
- * Requirement row that the merchant should use
- * to check for its KYC status.
- */
- uint64_t requirement_row;
-
- /**
- * Hash of the payto-URI of the account to KYC;
- */
- struct TALER_PaytoHashP h_payto;
-
- } unavailable_for_legal_reasons;
-
- /**
- * Details if the status is #MHD_HTTP_CONFLICT.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } conflict;
-
- /**
- * Details if the status is #MHD_HTTP_GONE.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } gone;
-
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * withdraw request to a exchange.
- *
- * @param cls closure
- * @param wr response details
- */
-typedef void
-(*TALER_EXCHANGE_WithdrawCallback) (
- void *cls,
- const struct TALER_EXCHANGE_WithdrawResponse *wr);
-
-
-/**
- * Withdraw a coin from the exchange using a /reserves/$RESERVE_PUB/withdraw
- * request. This API is typically used by a wallet to withdraw from a
- * reserve.
- *
- * Note that to ensure that no money is lost in case of hardware
- * failures, the caller must have committed (most of) the arguments to
- * disk before calling, and be ready to repeat the request with the
- * same arguments in case of failures.
- *
- * @param curl_ctx The curl context to use
- * @param exchange_url The base-URL of the exchange
- * @param keys The /keys material from the exchange
- * @param reserve_priv private key of the reserve to withdraw from
- * @param wci inputs that determine the planchet
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for @a res_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_WithdrawHandle *
-TALER_EXCHANGE_withdraw (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *exchange_url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const struct TALER_EXCHANGE_WithdrawCoinInput *wci,
- TALER_EXCHANGE_WithdrawCallback res_cb,
- void *res_cb_cls);
-
-
-/**
- * Cancel a withdraw status request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param wh the withdraw handle
- */
-void
-TALER_EXCHANGE_withdraw_cancel (struct TALER_EXCHANGE_WithdrawHandle *wh);
-
-
-/**
- * @brief A /reserves/$RESERVE_PUB/batch-withdraw Handle
- */
-struct TALER_EXCHANGE_BatchWithdrawHandle;
-
-
-/**
- * Details about a response for a batch withdraw request.
- */
-struct TALER_EXCHANGE_BatchWithdrawResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response.
- */
- union
- {
- /**
- * Details if the status is #MHD_HTTP_OK.
- */
- struct
- {
-
- /**
- * Array of coins returned by the batch withdraw operation.
- */
- struct TALER_EXCHANGE_PrivateCoinDetails *coins;
-
- /**
- * Length of the @e coins array.
- */
- unsigned int num_coins;
- } ok;
-
- /**
- * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
-
- /**
- * Hash of the payto-URI of the account to KYC;
- */
- struct TALER_PaytoHashP h_payto;
-
- /**
- * Legitimization requirement that the merchant should use
- * to check for its KYC status, 0 if not known.
- */
- uint64_t requirement_row;
- } unavailable_for_legal_reasons;
-
- /**
- * Details if the status is #MHD_HTTP_CONFLICT.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } conflict;
-
- /**
- * Details if the status is #MHD_HTTP_GONE.
- */
- struct
- {
- /* TODO: returning full details is not implemented */
- } gone;
-
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * batch withdraw request to a exchange.
- *
- * @param cls closure
- * @param wr response details
- */
-typedef void
-(*TALER_EXCHANGE_BatchWithdrawCallback) (
- void *cls,
- const struct TALER_EXCHANGE_BatchWithdrawResponse *wr);
-
-
-/**
- * Withdraw multiple coins from the exchange using a /reserves/$RESERVE_PUB/batch-withdraw
- * request. This API is typically used by a wallet to withdraw many coins from a
- * reserve.
- *
- * Note that to ensure that no money is lost in case of hardware
- * failures, the caller must have committed (most of) the arguments to
- * disk before calling, and be ready to repeat the request with the
- * same arguments in case of failures.
- *
- * @param curl_ctx The curl context to use
- * @param exchange_url The base-URL of the exchange
- * @param keys The /keys material from the exchange
- * @param reserve_priv private key of the reserve to withdraw from
- * @param wci_length number of entries in @a wcis
- * @param wcis inputs that determine the planchets
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for @a res_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_BatchWithdrawHandle *
-TALER_EXCHANGE_batch_withdraw (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *exchange_url,
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- unsigned int wci_length,
- const struct TALER_EXCHANGE_WithdrawCoinInput wcis[static wci_length],
- TALER_EXCHANGE_BatchWithdrawCallback res_cb,
- void *res_cb_cls);
-
-
-/**
- * Cancel a batch withdraw status request. This function cannot be used on a
- * request handle if a response is already served for it.
- *
- * @param wh the batch withdraw handle
- */
-void
-TALER_EXCHANGE_batch_withdraw_cancel (
- struct TALER_EXCHANGE_BatchWithdrawHandle *wh);
-
-
-/**
- * Response from a withdraw2 request.
- */
-struct TALER_EXCHANGE_Withdraw2Response
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status.
- */
- union
- {
- /**
- * Details if HTTP status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * blind signature over the coin
- */
- struct TALER_BlindedDenominationSignature blind_sig;
- } ok;
- } details;
-
-};
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * withdraw request to a exchange without the (un)blinding factor.
- *
- * @param cls closure
- * @param w2r response data
- */
-typedef void
-(*TALER_EXCHANGE_Withdraw2Callback) (
- void *cls,
- const struct TALER_EXCHANGE_Withdraw2Response *w2r);
-
-
-/**
- * @brief A /reserves/$RESERVE_PUB/withdraw Handle, 2nd variant.
- * This variant does not do the blinding/unblinding and only
- * fetches the blind signature on the already blinded planchet.
- * Used internally by the `struct TALER_EXCHANGE_WithdrawHandle`
- * implementation as well as for the tipping logic of merchants.
- */
-struct TALER_EXCHANGE_Withdraw2Handle;
-
-
-/**
- * Withdraw a coin from the exchange using a /reserves/$RESERVE_PUB/withdraw
- * request. This API is typically used by a merchant to withdraw a tip
- * where the blinding factor is unknown to the merchant.
- *
- * Note that to ensure that no money is lost in case of hardware
- * failures, the caller must have committed (most of) the arguments to
- * disk before calling, and be ready to repeat the request with the
- * same arguments in case of failures.
- *
- * @param curl_ctx The curl-context to use
- * @param exchange_url The base-URL of the exchange
- * @param keys The /keys material from the exchange
- * @param pd planchet details of the planchet to withdraw
- * @param reserve_priv private key of the reserve to withdraw from
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for @a res_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_Withdraw2Handle *
-TALER_EXCHANGE_withdraw2 (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *exchange_url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_PlanchetDetail *pd,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- TALER_EXCHANGE_Withdraw2Callback res_cb,
- void *res_cb_cls);
-
-
-/**
- * Cancel a withdraw status request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param wh the withdraw handle
- */
-void
-TALER_EXCHANGE_withdraw2_cancel (struct TALER_EXCHANGE_Withdraw2Handle *wh);
-
-
-/**
- * Response from a batch-withdraw request (2nd variant).
- */
-struct TALER_EXCHANGE_BatchWithdraw2Response
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status.
- */
- union
- {
- /**
- * Details if HTTP status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * array of blind signatures over the coins.
- */
- const struct TALER_BlindedDenominationSignature *blind_sigs;
-
- /**
- * length of @e blind_sigs
- */
- unsigned int blind_sigs_length;
-
- } ok;
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a batch
- * withdraw request to a exchange without the (un)blinding factor.
- *
- * @param cls closure
- * @param bw2r response data
- */
-typedef void
-(*TALER_EXCHANGE_BatchWithdraw2Callback) (
- void *cls,
- const struct TALER_EXCHANGE_BatchWithdraw2Response *bw2r);
-
-
-/**
- * @brief A /reserves/$RESERVE_PUB/batch-withdraw Handle, 2nd variant.
- * This variant does not do the blinding/unblinding and only
- * fetches the blind signatures on the already blinded planchets.
- * Used internally by the `struct TALER_EXCHANGE_BatchWithdrawHandle`
- * implementation as well as for the tipping logic of merchants.
- */
-struct TALER_EXCHANGE_BatchWithdraw2Handle;
-
-
-/**
- * Withdraw a coin from the exchange using a /reserves/$RESERVE_PUB/batch-withdraw
- * request. This API is typically used by a merchant to withdraw a tip
- * where the blinding factor is unknown to the merchant.
- *
- * Note that to ensure that no money is lost in case of hardware
- * failures, the caller must have committed (most of) the arguments to
- * disk before calling, and be ready to repeat the request with the
- * same arguments in case of failures.
- *
- * @param curl_ctx The curl context to use
- * @param exchange_url The base-URL of the exchange
- * @param keys The /keys material from the exchange
- * @param pds array of planchet details of the planchet to withdraw
- * @param pds_length number of entries in the @a pds array
- * @param reserve_priv private key of the reserve to withdraw from
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for @a res_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_BatchWithdraw2Handle *
-TALER_EXCHANGE_batch_withdraw2 (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *exchange_url,
- const struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- unsigned int pds_length,
- const struct TALER_PlanchetDetail pds[static pds_length],
- TALER_EXCHANGE_BatchWithdraw2Callback res_cb,
- void *res_cb_cls);
-
-
-/**
- * Cancel a batch withdraw request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param wh the withdraw handle
- */
-void
-TALER_EXCHANGE_batch_withdraw2_cancel (
- struct TALER_EXCHANGE_BatchWithdraw2Handle *wh);
-
-
-/* ********************* /reserve/$RESERVE_PUB/age-withdraw *************** */
-
-/**
- * @brief Information needed to withdraw (and reveal) age restricted coins.
- */
-struct TALER_EXCHANGE_AgeWithdrawCoinInput
-{
- /**
- * The master secret from which we derive all other relevant values for
- * the coin: private key, nonces (if applicable) and age restriction
- */
- struct TALER_PlanchetMasterSecretP secrets[TALER_CNC_KAPPA];
-
- /**
- * The denomination of the coin. Must support age restriction, i.e
- * its .keys.age_mask MUST not be 0
- */
- struct TALER_EXCHANGE_DenomPublicKey *denom_pub;
-};
-
-
-/**
- * All the details about a coin that are generated during age-withdrawal and
- * that may be needed for future operations on the coin.
- */
-struct TALER_EXCHANGE_AgeWithdrawCoinPrivateDetails
-{
- /**
- * Private key of the coin.
- */
- struct TALER_CoinSpendPrivateKeyP coin_priv;
-
- /**
- * Hash of the public key of the coin.
- */
- struct TALER_CoinPubHashP h_coin_pub;
-
- /**
- * Value used to blind the key for the signature.
- * Needed for recoup operations.
- */
- union TALER_DenominationBlindingKeyP blinding_key;
-
- /**
- * The age commitment, proof for the coin, derived from the
- * Master secret and maximum age in the originating request
- */
- struct TALER_AgeCommitmentProof age_commitment_proof;
-
- /**
- * The hash of the age commitment
- */
- struct TALER_AgeCommitmentHash h_age_commitment;
-
- /**
- * Values contributed from the exchange during the
- * withdraw protocol.
- */
- struct TALER_ExchangeWithdrawValues alg_values;
-
- /**
- * The planchet constructed
- */
- struct TALER_PlanchetDetail planchet;
-};
-
-/**
- * @brief A handle to a /reserves/$RESERVE_PUB/age-withdraw request
- */
-struct TALER_EXCHANGE_AgeWithdrawHandle;
-
-/**
- * @brief Details about the response for a age withdraw request.
- */
-struct TALER_EXCHANGE_AgeWithdrawResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response
- */
- union
- {
- /**
- * Details if the status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Index that should not be revealed during the age-withdraw reveal
- * phase.
- */
- uint8_t noreveal_index;
-
- /**
- * The commitment of the age-withdraw request, needed for the
- * subsequent call to /age-withdraw/$ACH/reveal
- */
- struct TALER_AgeWithdrawCommitmentHashP h_commitment;
-
- /**
- * The number of elements in @e coins, each referring to
- * TALER_CNC_KAPPA elements
- */
- size_t num_coins;
-
- /**
- * The computed details of the non-revealed @e num_coins coins to keep.
- */
- const struct TALER_EXCHANGE_AgeWithdrawCoinPrivateDetails *coin_details;
-
- /**
- * The array of blinded hashes of the non-revealed
- * @e num_coins coins, needed for the reveal step;
- */
- const struct TALER_BlindedCoinHashP *blinded_coin_hs;
-
- /**
- * Key used by the exchange to sign the response.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
- } ok;
- } details;
-};
-
-typedef void
-(*TALER_EXCHANGE_AgeWithdrawCallback)(
- void *cls,
- const struct TALER_EXCHANGE_AgeWithdrawResponse *awr);
-
-/**
- * Submit an age-withdraw request to the exchange and get the exchange's
- * response.
- *
- * This API is typically used by a wallet. Note that to ensure that
- * no money is lost in case of hardware failures, the provided
- * argument @a rd should be committed to persistent storage
- * prior to calling this function.
- *
- * @param curl_ctx The curl context
- * @param exchange_url The base url of the exchange
- * @param keys The denomination keys from the exchange
- * @param reserve_priv The pivate key to the reserve
- * @param num_coins The number of elements in @e coin_inputs
- * @param coin_inputs The input for the coins to withdraw
- * @param max_age The maximum age we commit to.
- * @param res_cb A callback for the result, maybe NULL
- * @param res_cb_cls A closure for @e res_cb, maybe NULL
- * @return a handle for this request; NULL if the argument was invalid.
- * In this case, the callback will not be called.
- */
-struct TALER_EXCHANGE_AgeWithdrawHandle *
-TALER_EXCHANGE_age_withdraw (
- struct GNUNET_CURL_Context *curl_ctx,
- struct TALER_EXCHANGE_Keys *keys,
- const char *exchange_url,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- size_t num_coins,
- const struct TALER_EXCHANGE_AgeWithdrawCoinInput coin_inputs[static
- num_coins],
- uint8_t max_age,
- TALER_EXCHANGE_AgeWithdrawCallback res_cb,
- void *res_cb_cls);
-
-/**
- * Cancel a age-withdraw request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param awh the age-withdraw handle
- */
-void
-TALER_EXCHANGE_age_withdraw_cancel (
- struct TALER_EXCHANGE_AgeWithdrawHandle *awh);
-
-
-/**++++++ age-withdraw with pre-blinded planchets ***************************/
-
-/**
- * @brief Information needed to withdraw (and reveal) age restricted coins.
- */
-struct TALER_EXCHANGE_AgeWithdrawBlindedInput
-{
- /**
- * The denomination of the coin. Must support age restriction, i.e
- * its .keys.age_mask MUST not be 0
- */
- const struct TALER_EXCHANGE_DenomPublicKey *denom_pub;
-
- /**
- * Blinded Planchets
- */
- struct TALER_PlanchetDetail planchet_details[TALER_CNC_KAPPA];
-};
-
-/**
- * Response from an age-withdraw request with pre-blinded planchets
- */
-struct TALER_EXCHANGE_AgeWithdrawBlindedResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status.
- */
- union
- {
- /**
- * Details if HTTP status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Index that should not be revealed during the age-withdraw reveal phase.
- * The struct TALER_PlanchetMasterSecretP * from the request
- * with this index are the ones to keep.
- */
- uint8_t noreveal_index;
-
- /**
- * The commitment of the call to age-withdraw, needed for the subsequent
- * call to /age-withdraw/$ACH/reveal.
- */
- struct TALER_AgeWithdrawCommitmentHashP h_commitment;
-
- /**
- * Key used by the exchange to sign the response.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- } ok;
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting an
- * age-withdraw request to a exchange with pre-blinded planchets
- * without the (un)blinding factor.
- *
- * @param cls closure
- * @param awbr response data
- */
-typedef void
-(*TALER_EXCHANGE_AgeWithdrawBlindedCallback) (
- void *cls,
- const struct TALER_EXCHANGE_AgeWithdrawBlindedResponse *awbr);
-
-
-/**
- * @brief A /reserves/$RESERVE_PUB/age-withdraw Handle, 2nd variant with
- * pre-blinded planchets.
- *
- * This variant does not do the blinding/unblinding and only
- * fetches the blind signatures on the already blinded planchets.
- * Used internally by the `struct TALER_EXCHANGE_BatchWithdrawHandle`
- * implementation as well as for the reward logic of merchants.
- */
-struct TALER_EXCHANGE_AgeWithdrawBlindedHandle;
-
-/**
- * Withdraw age-restricted coins from the exchange using a
- * /reserves/$RESERVE_PUB/age-withdraw request. This API is typically used
- * by a merchant to withdraw a reward where the planchets are pre-blinded and
- * the blinding factor is unknown to the merchant.
- *
- * Note that to ensure that no money is lost in case of hardware
- * failures, the caller must have committed (most of) the arguments to
- * disk before calling, and be ready to repeat the request with the
- * same arguments in case of failures.
- *
- * @param curl_ctx The curl context to use
- * @param exchange_url The base-URL of the exchange
- * @param keys The /keys material from the exchange
- * @param max_age The maximum age that the coins are committed to.
- * @param num_input number of entries in the @a blinded_input array
- * @param blinded_input array of planchet details of the planchet to withdraw
- * @param reserve_priv private key of the reserve to withdraw from
- * @param res_cb the callback to call when the final result for this request is available
- * @param res_cb_cls closure for @a res_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_AgeWithdrawBlindedHandle *
-TALER_EXCHANGE_age_withdraw_blinded (
- struct GNUNET_CURL_Context *curl_ctx,
- struct TALER_EXCHANGE_Keys *keys,
- const char *exchange_url,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- uint8_t max_age,
- unsigned int num_input,
- const struct TALER_EXCHANGE_AgeWithdrawBlindedInput blinded_input[static
- num_input],
- TALER_EXCHANGE_AgeWithdrawBlindedCallback res_cb,
- void *res_cb_cls);
-
-
-/**
- * Cancel an age-withdraw request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param awbh the age-withdraw handle
- */
-void
-TALER_EXCHANGE_age_withdraw_blinded_cancel (
- struct TALER_EXCHANGE_AgeWithdrawBlindedHandle *awbh);
-
-
-/* ********************* /age-withdraw/$ACH/reveal ************************ */
-
-/**
- * @brief A handle to a /age-withdraw/$ACH/reveal request
- */
-struct TALER_EXCHANGE_AgeWithdrawRevealHandle;
-
-/**
- * The response from a /age-withdraw/$ACH/reveal request
- */
-struct TALER_EXCHANGE_AgeWithdrawRevealResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response
- */
- union
- {
- /**
- * Details if the status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Number of signatures returned.
- */
- unsigned int num_sigs;
-
- /**
- * Array of @e num_coins blinded denomination signatures, giving each
- * coin its value and validity. The array give these coins in the same
- * order (and should have the same length) in which the original
- * age-withdraw request specified the respective denomination keys.
- */
- const struct TALER_BlindedDenominationSignature *blinded_denom_sigs;
-
- } ok;
- } details;
-
-};
-
-typedef void
-(*TALER_EXCHANGE_AgeWithdrawRevealCallback)(
- void *cls,
- const struct TALER_EXCHANGE_AgeWithdrawRevealResponse *awr);
-
-/**
- * Submit an age-withdraw-reveal request to the exchange and get the exchange's
- * response.
- *
- * This API is typically used by a wallet. Note that to ensure that
- * no money is lost in case of hardware failures, the provided
- * argument @a rd should be committed to persistent storage
- * prior to calling this function.
- *
- * @param curl_ctx The curl context
- * @param exchange_url The base url of the exchange
- * @param num_coins The number of elements in @e coin_inputs and @e alg_values
- * @param coin_inputs The input for the coins to withdraw, same as in the previous call to /age-withdraw
- * @param noreveal_index The index into each of the kappa coin candidates, that should not be revealed to the exchange
- * @param h_commitment The commmitment from the previous call to /age-withdraw
- * @param reserve_pub The public key of the reserve the original call to /age-withdraw was made to
- * @param res_cb A callback for the result, maybe NULL
- * @param res_cb_cls A closure for @e res_cb, maybe NULL
- * @return a handle for this request; NULL if the argument was invalid.
- * In this case, the callback will not be called.
- */
-struct TALER_EXCHANGE_AgeWithdrawRevealHandle *
-TALER_EXCHANGE_age_withdraw_reveal (
- struct GNUNET_CURL_Context *curl_ctx,
- const char *exchange_url,
- size_t num_coins,
- const struct TALER_EXCHANGE_AgeWithdrawCoinInput coin_inputs[static
- num_coins],
- uint8_t noreveal_index,
- const struct TALER_AgeWithdrawCommitmentHashP *h_commitment,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- TALER_EXCHANGE_AgeWithdrawRevealCallback res_cb,
- void *res_cb_cls);
-
-
-/**
- * @brief Cancel an age-withdraw-reveal request
- *
- * @param awrh Handle to an age-withdraw-reqveal request
- */
-void
-TALER_EXCHANGE_age_withdraw_reveal_cancel (
- struct TALER_EXCHANGE_AgeWithdrawRevealHandle *awrh);
-
-
-/* ********************* /refresh/melt+reveal ***************************** */
-
-
-/**
- * Information needed to melt (partially spent) coins to obtain fresh coins
- * that are unlinkable to the original coin(s). Note that melting more than
- * one coin in a single request will make those coins linkable, so we only melt
- * one coin at a time.
- */
-struct TALER_EXCHANGE_RefreshData
-{
- /**
- * private key of the coin to melt
- */
- struct TALER_CoinSpendPrivateKeyP melt_priv;
-
- /*
- * age commitment and proof and its hash that went into the original coin,
- * might be NULL.
- */
- const struct TALER_AgeCommitmentProof *melt_age_commitment_proof;
- const struct TALER_AgeCommitmentHash *melt_h_age_commitment;
-
- /**
- * amount specifying how much the coin will contribute to the melt
- * (including fee)
- */
- struct TALER_Amount melt_amount;
-
- /**
- * signatures affirming the validity of the public keys corresponding to the
- * @e melt_priv private key
- */
- struct TALER_DenominationSignature melt_sig;
-
- /**
- * denomination key information record corresponding to the @e melt_sig
- * validity of the keys
- */
- struct TALER_EXCHANGE_DenomPublicKey melt_pk;
-
- /**
- * array of @e pks_len denominations of fresh coins to create
- */
- const struct TALER_EXCHANGE_DenomPublicKey *fresh_pks;
-
- /**
- * length of the @e pks array
- */
- unsigned int fresh_pks_len;
-};
-
-
-/* ********************* /coins/$COIN_PUB/melt ***************************** */
-
-/**
- * @brief A /coins/$COIN_PUB/melt Handle
- */
-struct TALER_EXCHANGE_MeltHandle;
-
-
-/**
- * Information we obtain per coin during melting.
- */
-struct TALER_EXCHANGE_MeltBlindingDetail
-{
- /**
- * Exchange values contributed to the refresh operation
- */
- struct TALER_ExchangeWithdrawValues alg_value;
-
-};
-
-
-/**
- * Response returned to a /melt request.
- */
-struct TALER_EXCHANGE_MeltResponse
-{
- /**
- * Full HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Parsed response details, variant depending on the
- * @e hr.http_status.
- */
- union
- {
- /**
- * Results for status #MHD_HTTP_OK.
- */
- struct
- {
-
- /**
- * Information returned per coin.
- */
- const struct TALER_EXCHANGE_MeltBlindingDetail *mbds;
-
- /**
- * Key used by the exchange to sign the response.
- */
- struct TALER_ExchangePublicKeyP sign_key;
-
- /**
- * Length of the @a mbds array with the exchange values
- * and blinding keys we are using.
- */
- unsigned int num_mbds;
-
- /**
- * Gamma value chosen by the exchange.
- */
- uint32_t noreveal_index;
- } ok;
-
- } details;
-};
-
-
-/**
- * Callbacks of this type are used to notify the application about the result
- * of the /coins/$COIN_PUB/melt stage. If successful, the @a noreveal_index
- * should be committed to disk prior to proceeding
- * #TALER_EXCHANGE_refreshes_reveal().
- *
- * @param cls closure
- * @param mr response details
- */
-typedef void
-(*TALER_EXCHANGE_MeltCallback) (
- void *cls,
- const struct TALER_EXCHANGE_MeltResponse *mr);
-
-
-/**
- * Submit a melt request to the exchange and get the exchange's
- * response.
- *
- * This API is typically used by a wallet. Note that to ensure that
- * no money is lost in case of hardware failures, the provided
- * argument @a rd should be committed to persistent storage
- * prior to calling this function.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param rms the fresh secret that defines the refresh operation
- * @param rd the refresh data specifying the characteristics of the operation
- * @param melt_cb the callback to call with the result
- * @param melt_cb_cls closure for @a melt_cb
- * @return a handle for this request; NULL if the argument was invalid.
- * In this case, neither callback will be called.
- */
-struct TALER_EXCHANGE_MeltHandle *
-TALER_EXCHANGE_melt (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_RefreshMasterSecretP *rms,
- const struct TALER_EXCHANGE_RefreshData *rd,
- TALER_EXCHANGE_MeltCallback melt_cb,
- void *melt_cb_cls);
-
-
-/**
- * Cancel a melt request. This function cannot be used
- * on a request handle if the callback was already invoked.
- *
- * @param mh the melt handle
- */
-void
-TALER_EXCHANGE_melt_cancel (struct TALER_EXCHANGE_MeltHandle *mh);
-
-
-/* ********************* /refreshes/$RCH/reveal ***************************** */
-
-
-/**
- * Information about a coin obtained via /refreshes/$RCH/reveal.
- */
-struct TALER_EXCHANGE_RevealedCoinInfo
-{
- /**
- * Private key of the coin.
- */
- struct TALER_CoinSpendPrivateKeyP coin_priv;
-
- /**
- * Master secret of this coin.
- */
- struct TALER_PlanchetMasterSecretP ps;
-
- /**
- * Age commitment and its hash of the coin, might be NULL.
- */
- struct TALER_AgeCommitmentProof *age_commitment_proof;
- struct TALER_AgeCommitmentHash h_age_commitment;
-
- /**
- * Blinding keys used to blind the fresh coin.
- */
- union TALER_DenominationBlindingKeyP bks;
-
- /**
- * Signature affirming the validity of the coin.
- */
- struct TALER_DenominationSignature sig;
-
-};
-
-
-/**
- * Result of a /refreshes/$RCH/reveal request.
- */
-struct TALER_EXCHANGE_RevealResult
-{
- /**
- * HTTP status.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Parsed response details, variant depending on the
- * @e hr.http_status.
- */
- union
- {
- /**
- * Results for status #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Array of @e num_coins values about the coins obtained via the refresh
- * operation. The array give the coins in the same order (and should
- * have the same length) in which the original melt request specified the
- * respective denomination keys.
- */
- const struct TALER_EXCHANGE_RevealedCoinInfo *coins;
-
- /**
- * Number of coins returned.
- */
- unsigned int num_coins;
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to return the final result of
- * submitting a refresh request to a exchange. If the operation was
- * successful, this function returns the signatures over the coins
- * that were remelted.
- *
- * @param cls closure
- * @param rr result of the reveal operation
- */
-typedef void
-(*TALER_EXCHANGE_RefreshesRevealCallback)(
- void *cls,
- const struct TALER_EXCHANGE_RevealResult *rr);
-
-
-/**
- * @brief A /refreshes/$RCH/reveal Handle
- */
-struct TALER_EXCHANGE_RefreshesRevealHandle;
-
-
-/**
- * Submit a /refreshes/$RCH/reval request to the exchange and get the exchange's
- * response.
- *
- * This API is typically used by a wallet. Note that to ensure that
- * no money is lost in case of hardware failures, the provided
- * arguments should have been committed to persistent storage
- * prior to calling this function.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param rms the fresh secret that defines the refresh operation
- * @param rd the refresh data that characterizes the refresh operation
- * @param num_coins number of fresh coins to be created, length of the @a exchange_vals array, must match value in @a rd
- * @param alg_values array @a num_coins of exchange values contributed to the refresh operation
- * @param noreveal_index response from the exchange to the
- * #TALER_EXCHANGE_melt() invocation
- * @param reveal_cb the callback to call with the final result of the
- * refresh operation
- * @param reveal_cb_cls closure for the above callback
- * @return a handle for this request; NULL if the argument was invalid.
- * In this case, neither callback will be called.
- */
-struct TALER_EXCHANGE_RefreshesRevealHandle *
-TALER_EXCHANGE_refreshes_reveal (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_RefreshMasterSecretP *rms,
- const struct TALER_EXCHANGE_RefreshData *rd,
- unsigned int num_coins,
- const struct TALER_ExchangeWithdrawValues alg_values[static num_coins],
- uint32_t noreveal_index,
- TALER_EXCHANGE_RefreshesRevealCallback reveal_cb,
- void *reveal_cb_cls);
-
-
-/**
- * Cancel a refresh reveal request. This function cannot be used
- * on a request handle if the callback was already invoked.
- *
- * @param rrh the refresh reval handle
- */
-void
-TALER_EXCHANGE_refreshes_reveal_cancel (
- struct TALER_EXCHANGE_RefreshesRevealHandle *rrh);
-
-
-/* ********************* /coins/$COIN_PUB/link ***************************** */
-
-
-/**
- * @brief A /coins/$COIN_PUB/link Handle
- */
-struct TALER_EXCHANGE_LinkHandle;
-
-
-/**
- * Information about a coin obtained via /link.
- */
-struct TALER_EXCHANGE_LinkedCoinInfo
-{
- /**
- * Private key of the coin.
- */
- struct TALER_CoinSpendPrivateKeyP coin_priv;
-
- /**
- * Age commitment and its hash, if applicable.
- */
- bool has_age_commitment;
- struct TALER_AgeCommitmentProof age_commitment_proof;
- struct TALER_AgeCommitmentHash h_age_commitment;
-
- /**
- * Master secret of this coin.
- */
- struct TALER_PlanchetMasterSecretP ps;
-
- /**
- * Signature affirming the validity of the coin.
- */
- struct TALER_DenominationSignature sig;
-
- /**
- * Denomination public key of the coin.
- */
- struct TALER_DenominationPublicKey pub;
-};
-
-
-/**
- * Result of a /link request.
- */
-struct TALER_EXCHANGE_LinkResult
-{
- /**
- * HTTP status.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Parsed response details, variant depending on the
- * @e hr.http_status.
- */
- union
- {
- /**
- * Results for status #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Array of @e num_coins values about the
- * coins obtained via linkage.
- */
- const struct TALER_EXCHANGE_LinkedCoinInfo *coins;
-
- /**
- * Number of coins returned.
- */
- unsigned int num_coins;
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to return the final result of submitting a
- * /coins/$COIN_PUB/link request to a exchange. If the operation was
- * successful, this function returns the signatures over the coins that were
- * created when the original coin was melted.
- *
- * @param cls closure
- * @param lr result of the /link operation
- */
-typedef void
-(*TALER_EXCHANGE_LinkCallback) (
- void *cls,
- const struct TALER_EXCHANGE_LinkResult *lr);
-
-
-/**
- * Submit a link request to the exchange and get the exchange's response.
- *
- * This API is typically not used by anyone, it is more a threat against those
- * trying to receive a funds transfer by abusing the refresh protocol.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param coin_priv private key to request link data for
- * @param age_commitment_proof age commitment to the corresponding coin, might be NULL
- * @param link_cb the callback to call with the useful result of the
- * refresh operation the @a coin_priv was involved in (if any)
- * @param link_cb_cls closure for @a link_cb
- * @return a handle for this request
- */
-struct TALER_EXCHANGE_LinkHandle *
-TALER_EXCHANGE_link (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_CoinSpendPrivateKeyP *coin_priv,
- const struct TALER_AgeCommitmentProof *age_commitment_proof,
- TALER_EXCHANGE_LinkCallback link_cb,
- void *link_cb_cls);
-
-
-/**
- * Cancel a link request. This function cannot be used
- * on a request handle if the callback was already invoked.
- *
- * @param lh the link handle
- */
-void
-TALER_EXCHANGE_link_cancel (struct TALER_EXCHANGE_LinkHandle *lh);
-
-
-/* ********************* /transfers/$WTID *********************** */
-
-/**
- * @brief A /transfers/$WTID Handle
- */
-struct TALER_EXCHANGE_TransfersGetHandle;
-
-
-/**
- * Information the exchange returns per wire transfer.
- */
-struct TALER_EXCHANGE_TransferData
-{
-
- /**
- * exchange key used to sign
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * exchange signature over the transfer data
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * hash of the payto:// URI the transfer went to
- */
- struct TALER_PaytoHashP h_payto;
-
- /**
- * time when the exchange claims to have performed the wire transfer
- */
- struct GNUNET_TIME_Timestamp execution_time;
-
- /**
- * Actual amount of the wire transfer, excluding the wire fee.
- */
- struct TALER_Amount total_amount;
-
- /**
- * wire fee that was charged by the exchange
- */
- struct TALER_Amount wire_fee;
-
- /**
- * length of the @e details array
- */
- unsigned int details_length;
-
- /**
- * array with details about the combined transactions
- */
- const struct TALER_TrackTransferDetails *details;
-
-};
-
-
-/**
- * Response for a GET /transfers request.
- */
-struct TALER_EXCHANGE_TransfersGetResponse
-{
- /**
- * HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on HTTP status code.
- */
- union
- {
- /**
- * Details if status code is #MHD_HTTP_OK.
- */
- struct
- {
- struct TALER_EXCHANGE_TransferData td;
- } ok;
-
- } details;
-};
-
-
-/**
- * Function called with detailed wire transfer data, including all
- * of the coin transactions that were combined into the wire transfer.
- *
- * @param cls closure
- * @param tgr response data
- */
-typedef void
-(*TALER_EXCHANGE_TransfersGetCallback)(
- void *cls,
- const struct TALER_EXCHANGE_TransfersGetResponse *tgr);
-
-
-/**
- * Query the exchange about which transactions were combined
- * to create a wire transfer.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param wtid raw wire transfer identifier to get information about
- * @param cb callback to call
- * @param cb_cls closure for @a cb
- * @return handle to cancel operation
- */
-struct TALER_EXCHANGE_TransfersGetHandle *
-TALER_EXCHANGE_transfers_get (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_WireTransferIdentifierRawP *wtid,
- TALER_EXCHANGE_TransfersGetCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel wire deposits request. This function cannot be used on a request
- * handle if a response is already served for it.
- *
- * @param wdh the wire deposits request handle
- */
-void
-TALER_EXCHANGE_transfers_get_cancel (
- struct TALER_EXCHANGE_TransfersGetHandle *wdh);
-
-
-/* ********************* GET /deposits/ *********************** */
-
-
-/**
- * @brief A /deposits/ GET Handle
- */
-struct TALER_EXCHANGE_DepositGetHandle;
-
-
-/**
- * Data returned for a successful GET /deposits/ request.
- */
-struct TALER_EXCHANGE_GetDepositResponse
-{
-
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details about the response.
- */
- union
- {
-
- /**
- * Response if the status was #MHD_HTTP_OK
- */
- struct TALER_EXCHANGE_DepositData
- {
- /**
- * exchange key used to sign, all zeros if exchange did not
- * yet execute the transaction
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * signature from the exchange over the deposit data, all zeros if exchange did not
- * yet execute the transaction
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * wire transfer identifier used by the exchange, all zeros if exchange did not
- * yet execute the transaction
- */
- struct TALER_WireTransferIdentifierRawP wtid;
-
- /**
- * actual execution time for the wire transfer
- */
- struct GNUNET_TIME_Timestamp execution_time;
-
- /**
- * contribution to the total amount by this coin, all zeros if exchange did not
- * yet execute the transaction
- */
- struct TALER_Amount coin_contribution;
-
- } ok;
-
- /**
- * Response if the status was #MHD_HTTP_ACCEPTED
- */
- struct
- {
-
- /**
- * planned execution time for the wire transfer
- */
- struct GNUNET_TIME_Timestamp execution_time;
-
- /**
- * KYC legitimization requirement that the merchant should use to check
- * for its KYC status.
- */
- uint64_t requirement_row;
-
- /**
- * Current AML state for the account. May explain why transfers are
- * not happening.
- */
- enum TALER_AmlDecisionState aml_decision;
-
- /**
- * Set to 'true' if the KYC check is already finished and
- * the exchange is merely waiting for the @e execution_time.
- */
- bool kyc_ok;
- } accepted;
-
- } details;
-};
-
-
-/**
- * Function called with detailed wire transfer data.
- *
- * @param cls closure
- * @param dr details about the deposit response
- */
-typedef void
-(*TALER_EXCHANGE_DepositGetCallback)(
- void *cls,
- const struct TALER_EXCHANGE_GetDepositResponse *dr);
-
-
-/**
- * Obtain the wire transfer details for a given transaction. Tells the client
- * which aggregate wire transfer the deposit operation identified by @a coin_pub,
- * @a merchant_priv and @a h_contract_terms contributed to.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param merchant_priv the merchant's private key
- * @param h_wire hash of merchant's wire transfer details
- * @param h_contract_terms hash of the proposal data
- * @param coin_pub public key of the coin
- * @param timeout timeout to use for long-polling, 0 for no long polling
- * @param cb function to call with the result
- * @param cb_cls closure for @a cb
- * @return handle to abort request
- */
-struct TALER_EXCHANGE_DepositGetHandle *
-TALER_EXCHANGE_deposits_get (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_MerchantPrivateKeyP *merchant_priv,
- const struct TALER_MerchantWireHashP *h_wire,
- const struct TALER_PrivateContractHashP *h_contract_terms,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
- struct GNUNET_TIME_Relative timeout,
- TALER_EXCHANGE_DepositGetCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel deposit wtid request. This function cannot be used on a request
- * handle if a response is already served for it.
- *
- * @param dwh the wire deposits request handle
- */
-void
-TALER_EXCHANGE_deposits_get_cancel (
- struct TALER_EXCHANGE_DepositGetHandle *dwh);
-
-
-/**
- * Convenience function. Verifies a coin's transaction history as
- * returned by the exchange.
- *
- * @param dk fee structure for the coin
- * @param coin_pub public key of the coin
- * @param history history of the coin in json encoding
- * @param[out] total how much of the coin has been spent according to @a history
- * @return #GNUNET_OK if @a history is valid, #GNUNET_SYSERR if not
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGE_verify_coin_history (
- const struct TALER_EXCHANGE_DenomPublicKey *dk,
- const struct TALER_CoinSpendPublicKeyP *coin_pub,
- const json_t *history,
- struct TALER_Amount *total);
-
-
-/**
- * Parse history given in JSON format and return it in binary
- * format.
- *
- * @param keys exchange keys
- * @param history JSON array with the history
- * @param reserve_pub public key of the reserve to inspect
- * @param currency currency we expect the balance to be in
- * @param[out] total_in set to value of credits to reserve
- * @param[out] total_out set to value of debits from reserve
- * @param history_length number of entries in @a history
- * @param[out] rhistory array of length @a history_length, set to the
- * parsed history entries
- * @return #GNUNET_OK if history was valid and @a rhistory and @a balance
- * were set,
- * #GNUNET_SYSERR if there was a protocol violation in @a history
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGE_parse_reserve_history (
- const struct TALER_EXCHANGE_Keys *keys,
- const json_t *history,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- const char *currency,
- struct TALER_Amount *total_in,
- struct TALER_Amount *total_out,
- unsigned int history_length,
- struct TALER_EXCHANGE_ReserveHistoryEntry rhistory[static history_length]);
-
-
-/**
- * Free memory (potentially) allocated by #TALER_EXCHANGE_parse_reserve_history().
- *
- * @param len number of entries in @a rhistory
- * @param[in] rhistory result to free
- */
-void
-TALER_EXCHANGE_free_reserve_history (
- unsigned int len,
- struct TALER_EXCHANGE_ReserveHistoryEntry rhistory[static len]);
-
-
-/* ********************* /recoup *********************** */
-
-
-/**
- * @brief A /recoup Handle
- */
-struct TALER_EXCHANGE_RecoupHandle;
-
-
-/**
- * Response from a recoup request.
- */
-struct TALER_EXCHANGE_RecoupResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status.
- */
- union
- {
- /**
- * Details if HTTP status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * public key of the reserve receiving the recoup
- */
- struct TALER_ReservePublicKeyP reserve_pub;
-
- } ok;
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to return the final result of
- * submitting a recoup request to a exchange. If the operation was
- * successful, this function returns the @a reserve_pub of the
- * reserve that was credited.
- *
- * @param cls closure
- * @param rr response data
- */
-typedef void
-(*TALER_EXCHANGE_RecoupResultCallback) (
- void *cls,
- const struct TALER_EXCHANGE_RecoupResponse *rr);
-
-
-/**
- * Ask the exchange to pay back a coin due to the exchange triggering
- * the emergency recoup protocol for a given denomination. The value
- * of the coin will be refunded to the original customer (without fees).
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param pk kind of coin to pay back
- * @param denom_sig signature over the coin by the exchange using @a pk
- * @param exchange_vals contribution from the exchange on the withdraw
- * @param ps secret internals of the original planchet
- * @param recoup_cb the callback to call when the final result for this request is available
- * @param recoup_cb_cls closure for @a recoup_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_RecoupHandle *
-TALER_EXCHANGE_recoup (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_EXCHANGE_DenomPublicKey *pk,
- const struct TALER_DenominationSignature *denom_sig,
- const struct TALER_ExchangeWithdrawValues *exchange_vals,
- const struct TALER_PlanchetMasterSecretP *ps,
- TALER_EXCHANGE_RecoupResultCallback recoup_cb,
- void *recoup_cb_cls);
-
-
-/**
- * Cancel a recoup request. This function cannot be used on a
- * request handle if the callback was already invoked.
- *
- * @param ph the recoup handle
- */
-void
-TALER_EXCHANGE_recoup_cancel (struct TALER_EXCHANGE_RecoupHandle *ph);
-
-
-/* ********************* /recoup-refresh *********************** */
-
-
-/**
- * @brief A /recoup-refresh Handle
- */
-struct TALER_EXCHANGE_RecoupRefreshHandle;
-
-
-/**
- * Response from a /recoup-refresh request.
- */
-struct TALER_EXCHANGE_RecoupRefreshResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status.
- */
- union
- {
- /**
- * Details if HTTP status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * public key of the dirty coin that was credited
- */
- struct TALER_CoinSpendPublicKeyP old_coin_pub;
-
- } ok;
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to return the final result of
- * submitting a recoup-refresh request to a exchange.
- *
- * @param cls closure
- * @param rrr response data
- */
-typedef void
-(*TALER_EXCHANGE_RecoupRefreshResultCallback) (
- void *cls,
- const struct TALER_EXCHANGE_RecoupRefreshResponse *rrr);
-
-
-/**
- * Ask the exchange to pay back a coin due to the exchange triggering
- * the emergency recoup protocol for a given denomination. The value
- * of the coin will be refunded to the original coin that the
- * revoked coin was refreshed from. The original coin is then
- * considered a zombie.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param pk kind of coin to pay back
- * @param denom_sig signature over the coin by the exchange using @a pk
- * @param exchange_vals contribution from the exchange on the withdraw
- * @param rms melt secret of the refreshing operation
- * @param ps coin-specific secrets derived for this coin during the refreshing operation
- * @param idx index of the fresh coin in the refresh operation that is now being recouped
- * @param recoup_cb the callback to call when the final result for this request is available
- * @param recoup_cb_cls closure for @a recoup_cb
- * @return NULL
- * if the inputs are invalid (i.e. denomination key not with this exchange).
- * In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_RecoupRefreshHandle *
-TALER_EXCHANGE_recoup_refresh (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_EXCHANGE_DenomPublicKey *pk,
- const struct TALER_DenominationSignature *denom_sig,
- const struct TALER_ExchangeWithdrawValues *exchange_vals,
- const struct TALER_RefreshMasterSecretP *rms,
- const struct TALER_PlanchetMasterSecretP *ps,
- unsigned int idx,
- TALER_EXCHANGE_RecoupRefreshResultCallback recoup_cb,
- void *recoup_cb_cls);
-
-
-/**
- * Cancel a recoup-refresh request. This function cannot be used on a request
- * handle if the callback was already invoked.
- *
- * @param ph the recoup handle
- */
-void
-TALER_EXCHANGE_recoup_refresh_cancel (
- struct TALER_EXCHANGE_RecoupRefreshHandle *ph);
-
-
-/* ********************* /kyc* *********************** */
-
-/**
- * Handle for a ``/kyc-check`` operation.
- */
-struct TALER_EXCHANGE_KycCheckHandle;
-
-
-/**
- * KYC status response details.
- */
-struct TALER_EXCHANGE_KycStatus
-{
- /**
- * HTTP status code returned by the exchange.
- */
- unsigned int http_status;
-
- /**
- * Taler error code, if any.
- */
- enum TALER_ErrorCode ec;
-
- union
- {
-
- /**
- * KYC is OK, affirmation returned by the exchange.
- */
- struct
- {
-
- /**
- * Details about which KYC check(s) were passed.
- */
- const json_t *kyc_details;
-
- /**
- * Time of the affirmation.
- */
- struct GNUNET_TIME_Timestamp timestamp;
-
- /**
- * The signing public key used for @e exchange_sig.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * Signature of purpose
- * #TALER_SIGNATURE_EXCHANGE_ACCOUNT_SETUP_SUCCESS affirming
- * the successful KYC process.
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * AML status for the account.
- */
- enum TALER_AmlDecisionState aml_status;
-
- } ok;
-
- /**
- * KYC is required.
- */
- struct
- {
-
- /**
- * URL the user should open in a browser if
- * the KYC process is to be run. Returned if
- * @e http_status is #MHD_HTTP_ACCEPTED.
- */
- const char *kyc_url;
-
- /**
- * AML status for the account.
- */
- enum TALER_AmlDecisionState aml_status;
-
- } accepted;
-
- /**
- * KYC is OK, but account needs positive AML decision.
- */
- struct
- {
-
- /**
- * AML status for the account.
- */
- enum TALER_AmlDecisionState aml_status;
-
- } unavailable_for_legal_reasons;
-
- } details;
-
-};
-
-/**
- * Function called with the result of a KYC check.
- *
- * @param cls closure
- * @param ks the account's KYC status details
- */
-typedef void
-(*TALER_EXCHANGE_KycStatusCallback)(
- void *cls,
- const struct TALER_EXCHANGE_KycStatus *ks);
-
-
-/**
- * Run interaction with exchange to check KYC status
- * of a merchant.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param keys keys of the exchange
- * @param requirement_row number identifying the KYC requirement
- * @param h_payto hash of the payto:// URI at @a payment_target
- * @param ut type of the entity performing the KYC check
- * @param timeout how long to wait for a positive KYC status
- * @param cb function to call with the result
- * @param cb_cls closure for @a cb
- * @return NULL on error
- */
-struct TALER_EXCHANGE_KycCheckHandle *
-TALER_EXCHANGE_kyc_check (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- uint64_t requirement_row,
- const struct TALER_PaytoHashP *h_payto,
- enum TALER_KYCLOGIC_KycUserType ut,
- struct GNUNET_TIME_Relative timeout,
- TALER_EXCHANGE_KycStatusCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel KYC check operation.
- *
- * @param kyc handle for operation to cancel
- */
-void
-TALER_EXCHANGE_kyc_check_cancel (struct TALER_EXCHANGE_KycCheckHandle *kyc);
-
-
-/**
- * KYC proof response details.
- */
-struct TALER_EXCHANGE_KycProofResponse
-{
- /**
- * HTTP status code returned by the exchange.
- */
- unsigned int http_status;
-
- union
- {
-
- /**
- * KYC is OK, affirmation returned by the exchange.
- */
- struct
- {
-
- /**
- * Where to redirect the client next.
- */
- const char *redirect_url;
-
- } found;
-
- } details;
-
-};
-
-/**
- * Function called with the result of a KYC check.
- *
- * @param cls closure
- * @param kpr the account's KYC status details
- */
-typedef void
-(*TALER_EXCHANGE_KycProofCallback)(
- void *cls,
- const struct TALER_EXCHANGE_KycProofResponse *kpr);
-
-
-/**
- * Handle for a /kyc-proof operation.
- */
-struct TALER_EXCHANGE_KycProofHandle;
-
-
-/**
- * Run interaction with exchange to provide proof of KYC status.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param h_payto hash of payto URI identifying the target account
- * @param logic name of the KYC logic to run
- * @param args additional args to pass, can be NULL
- * or a string to append to the URL. Must then begin with '&'.
- * @param cb function to call with the result
- * @param cb_cls closure for @a cb
- * @return NULL on error
- */
-struct TALER_EXCHANGE_KycProofHandle *
-TALER_EXCHANGE_kyc_proof (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_PaytoHashP *h_payto,
- const char *logic,
- const char *args,
- TALER_EXCHANGE_KycProofCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel KYC proof operation.
- *
- * @param kph handle for operation to cancel
- */
-void
-TALER_EXCHANGE_kyc_proof_cancel (struct TALER_EXCHANGE_KycProofHandle *kph);
-
-
-/**
- * Handle for a ``/kyc-wallet`` operation.
- */
-struct TALER_EXCHANGE_KycWalletHandle;
-
-
-/**
- * KYC status response details.
- */
-struct TALER_EXCHANGE_WalletKycResponse
-{
-
- /**
- * HTTP status code returned by the exchange.
- */
- unsigned int http_status;
-
- /**
- * Taler error code, if any.
- */
- enum TALER_ErrorCode ec;
-
- /**
- * Variants depending on @e http_status.
- */
- union
- {
-
- /**
- * In case @e http_status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
- /**
- * Wallet's KYC requirement row.
- */
- uint64_t requirement_row;
-
- /**
- * Hash of the payto-URI identifying the wallet to KYC.
- */
- struct TALER_PaytoHashP h_payto;
-
- } unavailable_for_legal_reasons;
-
- } details;
-
-};
-
-/**
- * Function called with the result for a wallet looking
- * up its KYC payment target.
- *
- * @param cls closure
- * @param ks the wallets KYC payment target details
- */
-typedef void
-(*TALER_EXCHANGE_KycWalletCallback)(
- void *cls,
- const struct TALER_EXCHANGE_WalletKycResponse *ks);
-
-
-/**
- * Run interaction with exchange to find out the wallet's KYC
- * identifier.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param reserve_priv wallet private key to check
- * @param balance balance (or balance threshold) crossed by the wallet
- * @param cb function to call with the result
- * @param cb_cls closure for @a cb
- * @return NULL on error
- */
-struct TALER_EXCHANGE_KycWalletHandle *
-TALER_EXCHANGE_kyc_wallet (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const struct TALER_Amount *balance,
- TALER_EXCHANGE_KycWalletCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel KYC wallet operation
- *
- * @param kwh handle for operation to cancel
- */
-void
-TALER_EXCHANGE_kyc_wallet_cancel (struct TALER_EXCHANGE_KycWalletHandle *kwh);
-
-
-/* ********************* /management *********************** */
-
-
-/**
- * @brief Future Exchange's signature key
- */
-struct TALER_EXCHANGE_FutureSigningPublicKey
-{
- /**
- * The signing public key
- */
- struct TALER_ExchangePublicKeyP key;
-
- /**
- * Signature by the security module affirming it owns this key.
- */
- struct TALER_SecurityModuleSignatureP signkey_secmod_sig;
-
- /**
- * Validity start time
- */
- struct GNUNET_TIME_Timestamp valid_from;
-
- /**
- * Validity expiration time (how long the exchange may use it).
- */
- struct GNUNET_TIME_Timestamp valid_until;
-
- /**
- * Validity expiration time for legal disputes.
- */
- struct GNUNET_TIME_Timestamp valid_legal;
-};
-
-
-/**
- * @brief Public information about a future exchange's denomination key
- */
-struct TALER_EXCHANGE_FutureDenomPublicKey
-{
- /**
- * The public key
- */
- struct TALER_DenominationPublicKey key;
-
- /**
- * Signature by the security module affirming it owns this key.
- */
- struct TALER_SecurityModuleSignatureP denom_secmod_sig;
-
- /**
- * Timestamp indicating when the denomination key becomes valid
- */
- struct GNUNET_TIME_Timestamp valid_from;
-
- /**
- * Timestamp indicating when the denomination key can’t be used anymore to
- * withdraw new coins.
- */
- struct GNUNET_TIME_Timestamp withdraw_valid_until;
-
- /**
- * Timestamp indicating when coins of this denomination become invalid.
- */
- struct GNUNET_TIME_Timestamp expire_deposit;
-
- /**
- * When do signatures with this denomination key become invalid?
- * After this point, these signatures cannot be used in (legal)
- * disputes anymore, as the Exchange is then allowed to destroy its side
- * of the evidence. @e expire_legal is expected to be significantly
- * larger than @e expire_deposit (by a year or more).
- */
- struct GNUNET_TIME_Timestamp expire_legal;
-
- /**
- * The value of this denomination
- */
- struct TALER_Amount value;
-
- /**
- * The applicable fee for withdrawing a coin of this denomination
- */
- struct TALER_Amount fee_withdraw;
-
- /**
- * The applicable fee to spend a coin of this denomination
- */
- struct TALER_Amount fee_deposit;
-
- /**
- * The applicable fee to melt/refresh a coin of this denomination
- */
- struct TALER_Amount fee_refresh;
-
- /**
- * The applicable fee to refund a coin of this denomination
- */
- struct TALER_Amount fee_refund;
-
-};
-
-
-/**
- * @brief Information about future keys from the exchange.
- */
-struct TALER_EXCHANGE_FutureKeys
-{
-
- /**
- * Array of the exchange's online signing keys.
- */
- struct TALER_EXCHANGE_FutureSigningPublicKey *sign_keys;
-
- /**
- * Array of the exchange's denomination keys.
- */
- struct TALER_EXCHANGE_FutureDenomPublicKey *denom_keys;
-
- /**
- * Public key of the signkey security module.
- */
- struct TALER_SecurityModulePublicKeyP signkey_secmod_public_key;
-
- /**
- * Public key of the RSA denomination security module.
- */
- struct TALER_SecurityModulePublicKeyP denom_secmod_public_key;
-
- /**
- * Public key of the CS denomination security module.
- */
- struct TALER_SecurityModulePublicKeyP denom_secmod_cs_public_key;
-
- /**
- * Offline master public key used by this exchange.
- */
- struct TALER_MasterPublicKeyP master_pub;
-
- /**
- * Length of the @e sign_keys array (number of valid entries).
- */
- unsigned int num_sign_keys;
-
- /**
- * Length of the @e denom_keys array.
- */
- unsigned int num_denom_keys;
-
-};
-
-
-/**
- * Response from a /management/keys request.
- */
-struct TALER_EXCHANGE_ManagementGetKeysResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Response details depending on the HTTP status.
- */
- union
- {
- /**
- * Details if HTTP status is #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * information about the various keys used
- * by the exchange
- */
- struct TALER_EXCHANGE_FutureKeys keys;
-
- } ok;
- } details;
-
-};
-
-
-/**
- * Function called with information about future keys.
- *
- * @param cls closure
- * @param mgr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementGetKeysCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementGetKeysResponse *mgr);
-
-
-/**
- * @brief Handle for a GET /management/keys request.
- */
-struct TALER_EXCHANGE_ManagementGetKeysHandle;
-
-
-/**
- * Request future keys from the exchange. The obtained information will be
- * passed to the @a cb.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param cb function to call with the exchange's future keys result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementGetKeysHandle *
-TALER_EXCHANGE_get_management_keys (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- TALER_EXCHANGE_ManagementGetKeysCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_get_management_keys() operation.
- *
- * @param gh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_get_management_keys_cancel (
- struct TALER_EXCHANGE_ManagementGetKeysHandle *gh);
-
-
-/**
- * @brief Public information about a signature on an exchange's online signing key
- */
-struct TALER_EXCHANGE_SigningKeySignature
-{
- /**
- * The signing public key
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * Signature over this signing key by the exchange's master signature.
- * Of purpose #TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY
- */
- struct TALER_MasterSignatureP master_sig;
-
-};
-
-
-/**
- * @brief Public information about a signature on an exchange's denomination key
- */
-struct TALER_EXCHANGE_DenominationKeySignature
-{
- /**
- * The hash of the denomination's public key
- */
- struct TALER_DenominationHashP h_denom_pub;
-
- /**
- * Signature over this denomination key by the exchange's master signature.
- * Of purpose #TALER_SIGNATURE_MASTER_DENOMINATION_KEY_VALIDITY.
- */
- struct TALER_MasterSignatureP master_sig;
-
-};
-
-
-/**
- * Information needed for a POST /management/keys operation.
- */
-struct TALER_EXCHANGE_ManagementPostKeysData
-{
-
- /**
- * Array of the master signatures for the exchange's online signing keys.
- */
- struct TALER_EXCHANGE_SigningKeySignature *sign_sigs;
-
- /**
- * Array of the master signatures for the exchange's denomination keys.
- */
- struct TALER_EXCHANGE_DenominationKeySignature *denom_sigs;
-
- /**
- * Length of the @e sign_keys array (number of valid entries).
- */
- unsigned int num_sign_sigs;
-
- /**
- * Length of the @e denom_keys array.
- */
- unsigned int num_denom_sigs;
-};
-
-
-/**
- * Response from a POST /management/keys request.
- */
-struct TALER_EXCHANGE_ManagementPostKeysResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
-};
-
-
-/**
- * Function called with information about the post keys operation result.
- *
- * @param cls closure
- * @param mr response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementPostKeysCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementPostKeysResponse *mr);
-
-
-/**
- * @brief Handle for a POST /management/keys request.
- */
-struct TALER_EXCHANGE_ManagementPostKeysHandle;
-
-
-/**
- * Provide master-key signatures to the exchange.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param pkd signature data to POST
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementPostKeysHandle *
-TALER_EXCHANGE_post_management_keys (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_EXCHANGE_ManagementPostKeysData *pkd,
- TALER_EXCHANGE_ManagementPostKeysCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_post_management_keys() operation.
- *
- * @param ph handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_post_management_keys_cancel (
- struct TALER_EXCHANGE_ManagementPostKeysHandle *ph);
-
-
-/**
- * Information needed for a POST /management/extensions operation.
- *
- * It represents the interface ExchangeKeysResponse as defined in
- * https://docs.taler.net/design-documents/006-extensions.html#exchange
- */
-struct TALER_EXCHANGE_ManagementPostExtensionsData
-{
- const json_t *extensions;
- struct TALER_MasterSignatureP extensions_sig;
-};
-
-
-/**
- * Response from a POST /management/extensions request.
- */
-struct TALER_EXCHANGE_ManagementPostExtensionsResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
-};
-
-
-/**
- * Function called with information about the post extensions operation result.
- *
- * @param cls closure
- * @param hr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementPostExtensionsCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementPostExtensionsResponse *hr);
-
-/**
- * @brief Handle for a POST /management/extensions request.
- */
-struct TALER_EXCHANGE_ManagementPostExtensionsHandle;
-
-
-/**
- * Uploads the configurations of enabled extensions to the exchange, signed
- * with the master key.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param ped signature data to POST
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementPostExtensionsHandle *
-TALER_EXCHANGE_management_post_extensions (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_EXCHANGE_ManagementPostExtensionsData *ped,
- TALER_EXCHANGE_ManagementPostExtensionsCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_post_extensions() operation.
- *
- * @param ph handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_post_extensions_cancel (
- struct TALER_EXCHANGE_ManagementPostExtensionsHandle *ph);
-
-
-/**
- * Response from a POST /management/drain request.
- */
-struct TALER_EXCHANGE_ManagementDrainResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
-};
-
-
-/**
- * Function called with information about the drain profits result.
- *
- * @param cls closure
- * @param hr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementDrainProfitsCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementDrainResponse *hr);
-
-
-/**
- * @brief Handle for a POST /management/drain request.
- */
-struct TALER_EXCHANGE_ManagementDrainProfitsHandle;
-
-
-/**
- * Uploads the drain profits request.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param wtid wire transfer identifier to use
- * @param amount total to transfer
- * @param date when was the request created
- * @param account_section configuration section identifying account to debit
- * @param payto_uri RFC 8905 URI of the account to credit
- * @param master_sig signature affirming the operation
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementDrainProfitsHandle *
-TALER_EXCHANGE_management_drain_profits (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_WireTransferIdentifierRawP *wtid,
- const struct TALER_Amount *amount,
- struct GNUNET_TIME_Timestamp date,
- const char *account_section,
- const char *payto_uri,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementDrainProfitsCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_drain_profits() operation.
- *
- * @param dp handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_drain_profits_cancel (
- struct TALER_EXCHANGE_ManagementDrainProfitsHandle *dp);
-
-
-/**
- * Response from a POST /management/denominations/$DENOM/revoke request.
- */
-struct TALER_EXCHANGE_ManagementRevokeDenominationResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
-};
-
-
-/**
- * Function called with information about the post revocation operation result.
- *
- * @param cls closure
- * @param hr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementRevokeDenominationKeyCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementRevokeDenominationResponse *hr);
-
-
-/**
- * @brief Handle for a POST /management/denominations/$H_DENOM_PUB/revoke request.
- */
-struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle;
-
-
-/**
- * Inform the exchange that a denomination key was revoked.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param h_denom_pub hash of the denomination public key that was revoked
- * @param master_sig signature affirming the revocation
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *
-TALER_EXCHANGE_management_revoke_denomination_key (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_DenominationHashP *h_denom_pub,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementRevokeDenominationKeyCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_revoke_denomination_key() operation.
- *
- * @param rh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_revoke_denomination_key_cancel (
- struct TALER_EXCHANGE_ManagementRevokeDenominationKeyHandle *rh);
-
-
-/**
- * Response from a POST /management/signkeys/$SK/revoke request.
- */
-struct TALER_EXCHANGE_ManagementRevokeSigningKeyResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
-};
-
-/**
- * Function called with information about the post revocation operation result.
- *
- * @param cls closure
- * @param hr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementRevokeSigningKeyCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementRevokeSigningKeyResponse *hr);
-
-
-/**
- * @brief Handle for a POST /management/signkeys/$H_DENOM_PUB/revoke request.
- */
-struct TALER_EXCHANGE_ManagementRevokeSigningKeyHandle;
-
-
-/**
- * Inform the exchange that a signing key was revoked.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param exchange_pub the public signing key that was revoked
- * @param master_sig signature affirming the revocation
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementRevokeSigningKeyHandle *
-TALER_EXCHANGE_management_revoke_signing_key (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ExchangePublicKeyP *exchange_pub,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementRevokeSigningKeyCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_revoke_signing_key() operation.
- *
- * @param rh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_revoke_signing_key_cancel (
- struct TALER_EXCHANGE_ManagementRevokeSigningKeyHandle *rh);
-
-
-/**
- * Response from a POST /management/aml-officers request.
- */
-struct TALER_EXCHANGE_ManagementUpdateAmlOfficerResponse
-{
- /**
- * HTTP response data
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
-};
-
-/**
- * Function called with information about the change to
- * an AML officer status.
- *
- * @param cls closure
- * @param hr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementUpdateAmlOfficerCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementUpdateAmlOfficerResponse *hr);
-
-
-/**
- * @brief Handle for a POST /management/aml-officers/$OFFICER_PUB request.
- */
-struct TALER_EXCHANGE_ManagementUpdateAmlOfficer;
-
-
-/**
- * Inform the exchange that the status of an AML officer has changed.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param officer_pub the public signing key of the officer
- * @param officer_name name of the officer
- * @param change_date when to affect the status change
- * @param is_active true to enable the officer
- * @param read_only true to only allow read-only access
- * @param master_sig signature affirming the change
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementUpdateAmlOfficer *
-TALER_EXCHANGE_management_update_aml_officer (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_AmlOfficerPublicKeyP *officer_pub,
- const char *officer_name,
- struct GNUNET_TIME_Timestamp change_date,
- bool is_active,
- bool read_only,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementUpdateAmlOfficerCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_update_aml_officer() operation.
- *
- * @param rh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_update_aml_officer_cancel (
- struct TALER_EXCHANGE_ManagementUpdateAmlOfficer *rh);
-
-
-/**
- * Summary data about an AML decision.
- */
-struct TALER_EXCHANGE_AmlDecisionSummary
-{
- /**
- * What is the current monthly threshold.
- */
- struct TALER_Amount threshold;
-
- /**
- * Account the decision was made for.
- */
- struct TALER_PaytoHashP h_payto;
-
- /**
- * RowID of this decision.
- */
- uint64_t rowid;
-
- /**
- * Current decision state.
- */
- enum TALER_AmlDecisionState current_state;
-};
-
-
-/**
- * Information about AML decisions returned by the exchange.
- */
-struct TALER_EXCHANGE_AmlDecisionsResponse
-{
- /**
- * HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP response code.
- */
- union
- {
-
- /**
- * Information returned on success (#MHD_HTTP_OK).
- */
- struct
- {
-
- /**
- * Array of AML decision summaries returned by the exchange.
- */
- const struct TALER_EXCHANGE_AmlDecisionSummary *decisions;
-
- /**
- * Length of the @e decisions array.
- */
- unsigned int decisions_length;
-
- } ok;
-
- } details;
-};
-
-
-/**
- * Function called with summary information about
- * AML decisions.
- *
- * @param cls closure
- * @param adr response data
- */
-typedef void
-(*TALER_EXCHANGE_LookupAmlDecisionsCallback) (
- void *cls,
- const struct TALER_EXCHANGE_AmlDecisionsResponse *adr);
-
-
-/**
- * @brief Handle for a POST /aml/$OFFICER_PUB/decisions/$STATUS request.
- */
-struct TALER_EXCHANGE_LookupAmlDecisions;
-
-
-/**
- * Inform the exchange that an AML decision has been taken.
- *
- * @param ctx the context
- * @param exchange_url HTTP base URL for the exchange
- * @param start row number starting point (exclusive rowid)
- * @param delta number of records to return, negative for descending, positive for ascending from start
- * @param state type of AML decisions to return
- * @param officer_priv private key of the deciding AML officer
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_LookupAmlDecisions *
-TALER_EXCHANGE_lookup_aml_decisions (
- struct GNUNET_CURL_Context *ctx,
- const char *exchange_url,
- uint64_t start,
- int delta,
- enum TALER_AmlDecisionState state,
- const struct TALER_AmlOfficerPrivateKeyP *officer_priv,
- TALER_EXCHANGE_LookupAmlDecisionsCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_lookup_aml_decisions() operation.
- *
- * @param lh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_lookup_aml_decisions_cancel (
- struct TALER_EXCHANGE_LookupAmlDecisions *lh);
-
-
-/**
- * Detailed data about an AML decision.
- */
-struct TALER_EXCHANGE_AmlDecisionDetail
-{
- /**
- * When was the decision made.
- */
- struct GNUNET_TIME_Timestamp decision_time;
-
- /**
- * New threshold set by this decision.
- */
- struct TALER_Amount new_threshold;
-
- /**
- * Who made the decision?
- */
- struct TALER_AmlOfficerPublicKeyP decider_pub;
-
- /**
- * Justification given for the decision.
- */
- const char *justification;
-
- /**
- * New decision state.
- */
- enum TALER_AmlDecisionState new_state;
-};
-
-
-/**
- * Detailed data collected during a KYC process for the account.
- */
-struct TALER_EXCHANGE_KycHistoryDetail
-{
- /**
- * Configuration section name of the KYC provider that contributed the data.
- */
- const char *provider_section;
-
- /**
- * The collected KYC data.
- */
- const json_t *attributes;
-
- /**
- * When was the data collection made.
- */
- struct GNUNET_TIME_Timestamp collection_time;
-
-};
-
-
-/**
- * Information about AML decision details returned by the exchange.
- */
-struct TALER_EXCHANGE_AmlDecisionResponse
-{
- /**
- * HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP response code.
- */
- union
- {
-
- /**
- * Information returned on success (#MHD_HTTP_OK).
- */
- struct
- {
-
- /**
- * Array of AML decision details returned by the exchange.
- */
- const struct TALER_EXCHANGE_AmlDecisionDetail *aml_history;
-
- /**
- * Length of the @e aml_history array.
- */
- unsigned int aml_history_length;
-
- /**
- * Array of KYC data collections returned by the exchange.
- */
- const struct TALER_EXCHANGE_KycHistoryDetail *kyc_attributes;
-
- /**
- * Length of the @e kyc_attributes array.
- */
- unsigned int kyc_attributes_length;
-
- } ok;
-
- } details;
-};
-
-
-/**
- * Function called with summary information about
- * AML decisions.
- *
- * @param cls closure
- * @param adr response data
- */
-typedef void
-(*TALER_EXCHANGE_LookupAmlDecisionCallback) (
- void *cls,
- const struct TALER_EXCHANGE_AmlDecisionResponse *adr);
-
-
-/**
- * @brief Handle for a POST /aml/$OFFICER_PUB/decision/$H_PAYTO request.
- */
-struct TALER_EXCHANGE_LookupAmlDecision;
-
-
-/**
- * Inform the exchange that an AML decision has been taken.
- *
- * @param ctx the context
- * @param exchange_url HTTP base URL for the exchange
- * @param h_payto which account to return the decision history for
- * @param officer_priv private key of the deciding AML officer
- * @param history true to return the full history, otherwise only the last decision
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_LookupAmlDecision *
-TALER_EXCHANGE_lookup_aml_decision (
- struct GNUNET_CURL_Context *ctx,
- const char *exchange_url,
- const struct TALER_PaytoHashP *h_payto,
- const struct TALER_AmlOfficerPrivateKeyP *officer_priv,
- bool history,
- TALER_EXCHANGE_LookupAmlDecisionCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_lookup_aml_decision() operation.
- *
- * @param rh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_lookup_aml_decision_cancel (
- struct TALER_EXCHANGE_LookupAmlDecision *rh);
-
-
-/**
- * @brief Handle for a POST /aml-decision/$OFFICER_PUB request.
- */
-struct TALER_EXCHANGE_AddAmlDecision;
-
-
-/**
- * Response when making an AML decision.
- */
-struct TALER_EXCHANGE_AddAmlDecisionResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-
-/**
- * Function called with information about storing an
- * an AML decision.
- *
- * @param cls closure
- * @param adr response data
- */
-typedef void
-(*TALER_EXCHANGE_AddAmlDecisionCallback) (
- void *cls,
- const struct TALER_EXCHANGE_AddAmlDecisionResponse *adr);
-
-/**
- * Inform the exchange that an AML decision has been taken.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param justification human-readable justification
- * @param decision_time when was the decision made
- * @param new_threshold at what monthly amount threshold
- * should a revision be triggered
- * @param h_payto payto URI hash of the account the
- * decision is about
- * @param new_state updated AML state
- * @param kyc_requirements JSON array of KYC requirements being imposed, NULL for none
- * @param officer_priv private key of the deciding AML officer
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_AddAmlDecision *
-TALER_EXCHANGE_add_aml_decision (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const char *justification,
- struct GNUNET_TIME_Timestamp decision_time,
- const struct TALER_Amount *new_threshold,
- const struct TALER_PaytoHashP *h_payto,
- enum TALER_AmlDecisionState new_state,
- const json_t *kyc_requirements,
- const struct TALER_AmlOfficerPrivateKeyP *officer_priv,
- TALER_EXCHANGE_AddAmlDecisionCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_add_aml_decision() operation.
- *
- * @param rh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_add_aml_decision_cancel (
- struct TALER_EXCHANGE_AddAmlDecision *rh);
-
-
-/**
- * Response when adding a partner exchange.
- */
-struct TALER_EXCHANGE_ManagementAddPartnerResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-/**
- * Function called with information about the change to
- * an AML officer status.
- *
- * @param cls closure
- * @param apr response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementAddPartnerCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementAddPartnerResponse *apr);
-
-
-/**
- * @brief Handle for a POST /management/partners/$PARTNER_PUB request.
- */
-struct TALER_EXCHANGE_ManagementAddPartner;
-
-
-/**
- * Inform the exchange that the status of a partnering
- * exchange was defined.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param partner_pub the offline signing key of the partner
- * @param start_date validity period start
- * @param end_date validity period end
- * @param wad_frequency how often will we do wad transfers to this partner
- * @param wad_fee what is the wad fee to this partner
- * @param partner_base_url what is the base URL of the @a partner_pub exchange
- * @param master_sig the signature the signature
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementAddPartner *
-TALER_EXCHANGE_management_add_partner (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_MasterPublicKeyP *partner_pub,
- struct GNUNET_TIME_Timestamp start_date,
- struct GNUNET_TIME_Timestamp end_date,
- struct GNUNET_TIME_Relative wad_frequency,
- const struct TALER_Amount *wad_fee,
- const char *partner_base_url,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementAddPartnerCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_add_partner() operation.
- *
- * @param rh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_add_partner_cancel (
- struct TALER_EXCHANGE_ManagementAddPartner *rh);
-
-
-/**
- * Response when enabling an auditor.
- */
-struct TALER_EXCHANGE_ManagementAuditorEnableResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-/**
- * Function called with information about the auditor setup operation result.
- *
- * @param cls closure
- * @param aer response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementAuditorEnableCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementAuditorEnableResponse *aer);
-
-
-/**
- * @brief Handle for a POST /management/auditors request.
- */
-struct TALER_EXCHANGE_ManagementAuditorEnableHandle;
-
-
-/**
- * Inform the exchange that an auditor should be enable or enabled.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param auditor_pub the public signing key of the auditor
- * @param auditor_url base URL of the auditor
- * @param auditor_name human readable name for the auditor
- * @param validity_start when was this decided?
- * @param master_sig signature affirming the auditor addition
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementAuditorEnableHandle *
-TALER_EXCHANGE_management_enable_auditor (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_AuditorPublicKeyP *auditor_pub,
- const char *auditor_url,
- const char *auditor_name,
- struct GNUNET_TIME_Timestamp validity_start,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementAuditorEnableCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_enable_auditor() operation.
- *
- * @param ah handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_enable_auditor_cancel (
- struct TALER_EXCHANGE_ManagementAuditorEnableHandle *ah);
-
-/**
- * Response when disabling an auditor.
- */
-struct TALER_EXCHANGE_ManagementAuditorDisableResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-/**
- * Function called with information about the auditor disable operation result.
- *
- * @param cls closure
- * @param adr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementAuditorDisableCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementAuditorDisableResponse *adr);
-
-
-/**
- * @brief Handle for a POST /management/auditors/$AUDITOR_PUB/disable request.
- */
-struct TALER_EXCHANGE_ManagementAuditorDisableHandle;
-
-
-/**
- * Inform the exchange that an auditor should be disabled.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param auditor_pub the public signing key of the auditor
- * @param validity_end when was this decided?
- * @param master_sig signature affirming the auditor addition
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementAuditorDisableHandle *
-TALER_EXCHANGE_management_disable_auditor (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_AuditorPublicKeyP *auditor_pub,
- struct GNUNET_TIME_Timestamp validity_end,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementAuditorDisableCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_disable_auditor() operation.
- *
- * @param ah handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_disable_auditor_cancel (
- struct TALER_EXCHANGE_ManagementAuditorDisableHandle *ah);
-
-
-/**
- * Response from an exchange account/enable operation.
- */
-struct TALER_EXCHANGE_ManagementWireEnableResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-
-/**
- * Function called with information about the wire enable operation result.
- *
- * @param cls closure
- * @param wer HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementWireEnableCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementWireEnableResponse *wer);
-
-
-/**
- * @brief Handle for a POST /management/wire request.
- */
-struct TALER_EXCHANGE_ManagementWireEnableHandle;
-
-
-/**
- * Inform the exchange that a wire account should be enabled.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param payto_uri RFC 8905 URI of the exchange's bank account
- * @param conversion_url URL of the conversion service, or NULL if none
- * @param debit_restrictions JSON encoding of debit restrictions on the account; see AccountRestriction in the spec
- * @param credit_restrictions JSON encoding of credit restrictions on the account; see AccountRestriction in the spec
- * @param validity_start when was this decided?
- * @param master_sig1 signature affirming the wire addition
- * of purpose #TALER_SIGNATURE_MASTER_ADD_WIRE
- * @param master_sig2 signature affirming the validity of the account for clients;
- * of purpose #TALER_SIGNATURE_MASTER_WIRE_DETAILS.
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementWireEnableHandle *
-TALER_EXCHANGE_management_enable_wire (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const char *payto_uri,
- const char *conversion_url,
- const json_t *debit_restrictions,
- const json_t *credit_restrictions,
- struct GNUNET_TIME_Timestamp validity_start,
- const struct TALER_MasterSignatureP *master_sig1,
- const struct TALER_MasterSignatureP *master_sig2,
- TALER_EXCHANGE_ManagementWireEnableCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_enable_wire() operation.
- *
- * @param wh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_enable_wire_cancel (
- struct TALER_EXCHANGE_ManagementWireEnableHandle *wh);
-
-
-/**
- * Response from an exchange account/disable operation.
- */
-struct TALER_EXCHANGE_ManagementWireDisableResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-/**
- * Function called with information about the wire disable operation result.
- *
- * @param cls closure
- * @param wdr response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementWireDisableCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementWireDisableResponse *wdr);
-
-
-/**
- * @brief Handle for a POST /management/wire/disable request.
- */
-struct TALER_EXCHANGE_ManagementWireDisableHandle;
-
-
-/**
- * Inform the exchange that a wire account should be disabled.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param payto_uri RFC 8905 URI of the exchange's bank account
- * @param validity_end when was this decided?
- * @param master_sig signature affirming the wire addition
- * of purpose #TALER_SIGNATURE_MASTER_DEL_WIRE
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementWireDisableHandle *
-TALER_EXCHANGE_management_disable_wire (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const char *payto_uri,
- struct GNUNET_TIME_Timestamp validity_end,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementWireDisableCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_disable_wire() operation.
- *
- * @param wh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_disable_wire_cancel (
- struct TALER_EXCHANGE_ManagementWireDisableHandle *wh);
-
-
-/**
- * Response when setting wire fees.
- */
-struct TALER_EXCHANGE_ManagementSetWireFeeResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-/**
- * Function called with information about the wire enable operation result.
- *
- * @param cls closure
- * @param wfr response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementSetWireFeeCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementSetWireFeeResponse *wfr);
-
-
-/**
- * @brief Handle for a POST /management/wire-fees request.
- */
-struct TALER_EXCHANGE_ManagementSetWireFeeHandle;
-
-
-/**
- * Inform the exchange about future wire fees.
- *
- * @param ctx the context
- * @param exchange_base_url HTTP base URL for the exchange
- * @param wire_method for which wire method are fees provided
- * @param validity_start start date for the provided wire fees
- * @param validity_end end date for the provided wire fees
- * @param fees the wire fees for this time period
- * @param master_sig signature affirming the wire fees;
- * of purpose #TALER_SIGNATURE_MASTER_WIRE_FEES
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementSetWireFeeHandle *
-TALER_EXCHANGE_management_set_wire_fees (
- struct GNUNET_CURL_Context *ctx,
- const char *exchange_base_url,
- const char *wire_method,
- struct GNUNET_TIME_Timestamp validity_start,
- struct GNUNET_TIME_Timestamp validity_end,
- const struct TALER_WireFeeSet *fees,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementSetWireFeeCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_enable_wire() operation.
- *
- * @param swfh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_set_wire_fees_cancel (
- struct TALER_EXCHANGE_ManagementSetWireFeeHandle *swfh);
-
-
-/**
- * Response when setting global fees.
- */
-struct TALER_EXCHANGE_ManagementSetGlobalFeeResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-
-/**
- * Function called with information about the global fee setting operation result.
- *
- * @param cls closure
- * @param gfr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ManagementSetGlobalFeeCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ManagementSetGlobalFeeResponse *gfr);
-
-
-/**
- * @brief Handle for a POST /management/global-fees request.
- */
-struct TALER_EXCHANGE_ManagementSetGlobalFeeHandle;
-
-
-/**
- * Inform the exchange about global fees.
- *
- * @param ctx the context
- * @param exchange_base_url HTTP base URL for the exchange
- * @param validity_start start date for the provided wire fees
- * @param validity_end end date for the provided wire fees
- * @param fees the wire fees for this time period
- * @param purse_timeout when do purses time out
- * @param history_expiration how long are account histories preserved
- * @param purse_account_limit how many purses are free per account
- * @param master_sig signature affirming the wire fees;
- * of purpose #TALER_SIGNATURE_MASTER_GLOBAL_FEES
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ManagementSetGlobalFeeHandle *
-TALER_EXCHANGE_management_set_global_fees (
- struct GNUNET_CURL_Context *ctx,
- const char *exchange_base_url,
- struct GNUNET_TIME_Timestamp validity_start,
- struct GNUNET_TIME_Timestamp validity_end,
- const struct TALER_GlobalFeeSet *fees,
- struct GNUNET_TIME_Relative purse_timeout,
- struct GNUNET_TIME_Relative history_expiration,
- uint32_t purse_account_limit,
- const struct TALER_MasterSignatureP *master_sig,
- TALER_EXCHANGE_ManagementSetGlobalFeeCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_management_enable_wire() operation.
- *
- * @param sgfh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_management_set_global_fees_cancel (
- struct TALER_EXCHANGE_ManagementSetGlobalFeeHandle *sgfh);
-
-
-/**
- * Response when adding denomination signature by auditor.
- */
-struct TALER_EXCHANGE_AuditorAddDenominationResponse
-{
- /**
- * HTTP response data.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-
-/**
- * Function called with information about the POST
- * /auditor/$AUDITOR_PUB/$H_DENOM_PUB operation result.
- *
- * @param cls closure
- * @param adr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_AuditorAddDenominationCallback) (
- void *cls,
- const struct TALER_EXCHANGE_AuditorAddDenominationResponse *adr);
-
-
-/**
- * @brief Handle for a POST /auditor/$AUDITOR_PUB/$H_DENOM_PUB request.
- */
-struct TALER_EXCHANGE_AuditorAddDenominationHandle;
-
-
-/**
- * Provide auditor signatures for a denomination to the exchange.
- *
- * @param ctx the context
- * @param url HTTP base URL for the exchange
- * @param h_denom_pub hash of the public key of the denomination
- * @param auditor_pub public key of the auditor
- * @param auditor_sig signature of the auditor, of
- * purpose #TALER_SIGNATURE_AUDITOR_EXCHANGE_KEYS
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_AuditorAddDenominationHandle *
-TALER_EXCHANGE_add_auditor_denomination (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_DenominationHashP *h_denom_pub,
- const struct TALER_AuditorPublicKeyP *auditor_pub,
- const struct TALER_AuditorSignatureP *auditor_sig,
- TALER_EXCHANGE_AuditorAddDenominationCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_add_auditor_denomination() operation.
- *
- * @param ah handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_add_auditor_denomination_cancel (
- struct TALER_EXCHANGE_AuditorAddDenominationHandle *ah);
-
-
-/* ********************* W2W API ****************** */
-
-
-/**
- * Response generated for a contract get request.
- */
-struct TALER_EXCHANGE_ContractGetResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP status code.
- */
- union
- {
- /**
- * Information returned on #MHD_HTTP_OK.
- */
- struct
- {
-
- /**
- * Public key of the purse.
- */
- struct TALER_PurseContractPublicKeyP purse_pub;
-
- /**
- * Encrypted contract.
- */
- const void *econtract;
-
- /**
- * Number of bytes in @e econtract.
- */
- size_t econtract_size;
-
- } ok;
-
- } details;
-
-};
-
-/**
- * Function called with information about the a purse.
- *
- * @param cls closure
- * @param cgr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ContractGetCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ContractGetResponse *cgr);
-
-
-/**
- * @brief Handle for a GET /contracts/$CPUB request.
- */
-struct TALER_EXCHANGE_ContractsGetHandle;
-
-
-/**
- * Request information about a contract from the exchange.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param contract_priv private key of the contract
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_ContractsGetHandle *
-TALER_EXCHANGE_contract_get (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ContractDiffiePrivateP *contract_priv,
- TALER_EXCHANGE_ContractGetCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_contract_get() operation.
- *
- * @param cgh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_contract_get_cancel (
- struct TALER_EXCHANGE_ContractsGetHandle *cgh);
-
-
-/**
- * Response generated for a purse get request.
- */
-struct TALER_EXCHANGE_PurseGetResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP status.
- */
- union
- {
- /**
- * Response on #MHD_HTTP_OK.
- */
- struct
- {
-
- /**
- * Time when the purse was merged (or zero if it
- * was not merged).
- */
- struct GNUNET_TIME_Timestamp merge_timestamp;
-
- /**
- * Time when the full amount was deposited into
- * the purse (or zero if a sufficient amount
- * was not yet deposited).
- */
- struct GNUNET_TIME_Timestamp deposit_timestamp;
-
- /**
- * Reserve balance (how much was deposited in
- * total into the reserve, minus deposit fees).
- */
- struct TALER_Amount balance;
-
- /**
- * Time when the purse will expire.
- */
- struct GNUNET_TIME_Timestamp purse_expiration;
-
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Function called with information about the a purse.
- *
- * @param cls closure
- * @param pgr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_PurseGetCallback) (
- void *cls,
- const struct TALER_EXCHANGE_PurseGetResponse *pgr);
-
-
-/**
- * @brief Handle for a GET /purses/$PPUB request.
- */
-struct TALER_EXCHANGE_PurseGetHandle;
-
-
-/**
- * Request information about a purse from the exchange.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param purse_pub public key of the purse
- * @param timeout how long to wait for a change to happen
- * @param wait_for_merge true to wait for a merge event, otherwise wait for a deposit event
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_PurseGetHandle *
-TALER_EXCHANGE_purse_get (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_PurseContractPublicKeyP *purse_pub,
- struct GNUNET_TIME_Relative timeout,
- bool wait_for_merge,
- TALER_EXCHANGE_PurseGetCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_purse_get() operation.
- *
- * @param pgh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_purse_get_cancel (
- struct TALER_EXCHANGE_PurseGetHandle *pgh);
-
-
-/**
- * Response generated for a purse creation request.
- */
-struct TALER_EXCHANGE_PurseCreateDepositResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP status.
- */
- union
- {
-
- /**
- * Detailed returned on #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Signing key used by the exchange to sign the
- * purse create with deposit confirmation.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * Signature from the exchange on the
- * purse create with deposit confirmation.
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
-
- } ok;
-
- } details;
-
-};
-
-/**
- * Function called with information about the creation
- * of a new purse.
- *
- * @param cls closure
- * @param pcr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_PurseCreateDepositCallback) (
- void *cls,
- const struct TALER_EXCHANGE_PurseCreateDepositResponse *pcr);
-
-
-/**
- * @brief Handle for a POST /purses/$PID/create request.
- */
-struct TALER_EXCHANGE_PurseCreateDepositHandle;
-
-
-/**
- * Information about a coin to be deposited into a purse or reserve.
- */
-struct TALER_EXCHANGE_PurseDeposit
-{
- /**
- * Age commitment data, might be NULL.
- */
- const struct TALER_AgeCommitmentProof *age_commitment_proof;
-
- /**
- * Private key of the coin.
- */
- struct TALER_CoinSpendPrivateKeyP coin_priv;
-
- /**
- * Signature proving the validity of the coin.
- */
- struct TALER_DenominationSignature denom_sig;
-
- /**
- * Hash of the denomination's public key.
- */
- struct TALER_DenominationHashP h_denom_pub;
-
- /**
- * Amount of the coin to transfer into the purse.
- */
- struct TALER_Amount amount;
-
-};
-
-
-/**
- * Inform the exchange that a purse should be created
- * and coins deposited into it.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param purse_priv private key of the purse
- * @param merge_priv the merge credential
- * @param contract_priv key needed to obtain and decrypt the contract
- * @param contract_terms contract the purse is about
- * @param num_deposits length of the @a deposits array
- * @param deposits array of deposits to make into the purse
- * @param upload_contract true to upload the contract; must
- * be FALSE for repeated calls to this API for the
- * same purse (i.e. when adding more deposits).
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_PurseCreateDepositHandle *
-TALER_EXCHANGE_purse_create_with_deposit (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_PurseContractPrivateKeyP *purse_priv,
- const struct TALER_PurseMergePrivateKeyP *merge_priv,
- const struct TALER_ContractDiffiePrivateP *contract_priv,
- const json_t *contract_terms,
- unsigned int num_deposits,
- const struct TALER_EXCHANGE_PurseDeposit deposits[static num_deposits],
- bool upload_contract,
- TALER_EXCHANGE_PurseCreateDepositCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_purse_create_with_deposit() operation.
- *
- * @param pch handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_purse_create_with_deposit_cancel (
- struct TALER_EXCHANGE_PurseCreateDepositHandle *pch);
-
-
-/**
- * Response generated for a purse deletion request.
- */
-struct TALER_EXCHANGE_PurseDeleteResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-};
-
-
-/**
- * Function called with information about the deletion
- * of a purse.
- *
- * @param cls closure
- * @param pdr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_PurseDeleteCallback) (
- void *cls,
- const struct TALER_EXCHANGE_PurseDeleteResponse *pdr);
-
-
-/**
- * @brief Handle for a DELETE /purses/$PID request.
- */
-struct TALER_EXCHANGE_PurseDeleteHandle;
-
-
-/**
- * Asks the exchange to delete a purse. Will only succeed if
- * the purse was not yet merged and did not yet time out.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param purse_priv private key of the purse
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_PurseDeleteHandle *
-TALER_EXCHANGE_purse_delete (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_PurseContractPrivateKeyP *purse_priv,
- TALER_EXCHANGE_PurseDeleteCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_purse_delete() operation.
- *
- * @param pdh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_purse_delete_cancel (
- struct TALER_EXCHANGE_PurseDeleteHandle *pdh);
-
-
-/**
- * Response generated for an account merge request.
- */
-struct TALER_EXCHANGE_AccountMergeResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Reserve signature affirming the merge.
- */
- const struct TALER_ReserveSignatureP *reserve_sig;
-
- /**
- * Details depending on the HTTP status.
- */
- union
- {
- /**
- * Detailed returned on #MHD_HTTP_OK.
- */
- struct
- {
- /**
- * Signature by the exchange affirming the merge.
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * Online signing key used by the exchange.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * Timestamp of the exchange for @e exchange_sig.
- */
- struct GNUNET_TIME_Timestamp etime;
-
- } ok;
-
- /**
- * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
- /**
- * Requirement row target that the merchant should use
- * to check for its KYC status.
- */
- uint64_t requirement_row;
- } unavailable_for_legal_reasons;
-
- } details;
-
-};
-
-/**
- * Function called with information about an account merge
- * operation.
- *
- * @param cls closure
- * @param amr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_AccountMergeCallback) (
- void *cls,
- const struct TALER_EXCHANGE_AccountMergeResponse *amr);
-
-
-/**
- * @brief Handle for a POST /purses/$PID/merge request.
- */
-struct TALER_EXCHANGE_AccountMergeHandle;
-
-
-/**
- * Inform the exchange that a purse should be merged
- * with a reserve.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param reserve_exchange_url base URL of the exchange with the reserve
- * @param reserve_priv private key of the reserve to merge into
- * @param purse_pub public key of the purse to merge
- * @param merge_priv private key granting us the right to merge
- * @param h_contract_terms hash of the purses' contract
- * @param min_age minimum age of deposits into the purse
- * @param purse_value_after_fees amount that should be in the purse
- * @param purse_expiration when will the purse expire
- * @param merge_timestamp when is the merge happening (current time)
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_AccountMergeHandle *
-TALER_EXCHANGE_account_merge (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const char *reserve_exchange_url,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const struct TALER_PurseContractPublicKeyP *purse_pub,
- const struct TALER_PurseMergePrivateKeyP *merge_priv,
- const struct TALER_PrivateContractHashP *h_contract_terms,
- uint8_t min_age,
- const struct TALER_Amount *purse_value_after_fees,
- struct GNUNET_TIME_Timestamp purse_expiration,
- struct GNUNET_TIME_Timestamp merge_timestamp,
- TALER_EXCHANGE_AccountMergeCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_account_merge() operation.
- *
- * @param amh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_account_merge_cancel (
- struct TALER_EXCHANGE_AccountMergeHandle *amh);
-
-
-/**
- * Response generated for a purse creation request.
- */
-struct TALER_EXCHANGE_PurseCreateMergeResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Reserve signature generated for the request
- * (client-side).
- */
- const struct TALER_ReserveSignatureP *reserve_sig;
-
- /**
- * Details depending on the HTTP status.
- */
- union
- {
- /**
- * Details returned on #MHD_HTTP_OK.
- */
- struct
- {
-
- } ok;
-
- /**
- * Details if the status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
- /**
- * Requirement row that the merchant should use
- * to check for its KYC status.
- */
- uint64_t requirement_row;
- } unavailable_for_legal_reasons;
-
- } details;
-
-};
-
-/**
- * Function called with information about the creation
- * of a new purse.
- *
- * @param cls closure
- * @param pcr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_PurseCreateMergeCallback) (
- void *cls,
- const struct TALER_EXCHANGE_PurseCreateMergeResponse *pcr);
-
-
-/**
- * @brief Handle for a POST /reserves/$RID/purse request.
- */
-struct TALER_EXCHANGE_PurseCreateMergeHandle;
-
-
-/**
- * Inform the exchange that a purse should be created
- * and merged with a reserve.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param reserve_priv private key of the reserve
- * @param purse_priv private key of the purse
- * @param merge_priv private key of the merge capability
- * @param contract_priv private key to get the contract
- * @param contract_terms contract the purse is about
- * @param upload_contract true to upload the contract
- * @param pay_for_purse true to pay for purse creation
- * @param merge_timestamp when should the merge happen (use current time)
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_PurseCreateMergeHandle *
-TALER_EXCHANGE_purse_create_with_merge (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const struct TALER_PurseContractPrivateKeyP *purse_priv,
- const struct TALER_PurseMergePrivateKeyP *merge_priv,
- const struct TALER_ContractDiffiePrivateP *contract_priv,
- const json_t *contract_terms,
- bool upload_contract,
- bool pay_for_purse,
- struct GNUNET_TIME_Timestamp merge_timestamp,
- TALER_EXCHANGE_PurseCreateMergeCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_purse_create_with_merge() operation.
- *
- * @param pcm handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_purse_create_with_merge_cancel (
- struct TALER_EXCHANGE_PurseCreateMergeHandle *pcm);
-
-
-/**
- * Response generated for purse deposit request.
- */
-struct TALER_EXCHANGE_PurseDepositResponse
-{
- /**
- * Full HTTP response.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on the HTTP status.
- */
- union
- {
- /**
- * Detailed returned on #MHD_HTTP_OK.
- */
- struct
- {
-
- /**
- * When does the purse expire.
- */
- struct GNUNET_TIME_Timestamp purse_expiration;
-
- /**
- * How much was actually deposited into the purse.
- */
- struct TALER_Amount total_deposited;
-
- /**
- * How much should be in the purse in total in the end.
- */
- struct TALER_Amount purse_value_after_fees;
-
- /**
- * Hash of the contract (needed to verify signature).
- */
- struct TALER_PrivateContractHashP h_contract_terms;
-
- } ok;
- } details;
-
-};
-
-/**
- * Function called with information about a purse-deposit
- * operation.
- *
- * @param cls closure
- * @param pdr HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_PurseDepositCallback) (
- void *cls,
- const struct TALER_EXCHANGE_PurseDepositResponse *pdr);
-
-
-/**
- * @brief Handle for a POST /purses/$PID/deposit request.
- */
-struct TALER_EXCHANGE_PurseDepositHandle;
-
-
-/**
- * Inform the exchange that a deposit should be made into
- * a purse.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param purse_exchange_url base URL of the exchange hosting the purse
- * @param purse_pub public key of the purse to merge
- * @param min_age minimum age we need to prove for the purse
- * @param num_deposits length of the @a deposits array
- * @param deposits array of deposits to make into the purse
- * @param cb function to call with the exchange's result
- * @param cb_cls closure for @a cb
- * @return the request handle; NULL upon error
- */
-struct TALER_EXCHANGE_PurseDepositHandle *
-TALER_EXCHANGE_purse_deposit (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const char *purse_exchange_url,
- const struct TALER_PurseContractPublicKeyP *purse_pub,
- uint8_t min_age,
- unsigned int num_deposits,
- const struct TALER_EXCHANGE_PurseDeposit deposits[static num_deposits],
- TALER_EXCHANGE_PurseDepositCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel #TALER_EXCHANGE_purse_deposit() operation.
- *
- * @param amh handle of the operation to cancel
- */
-void
-TALER_EXCHANGE_purse_deposit_cancel (
- struct TALER_EXCHANGE_PurseDepositHandle *amh);
-
-
-/* ********************* /reserves/$RID/open *********************** */
-
-
-/**
- * @brief A /reserves/$RID/open Handle
- */
-struct TALER_EXCHANGE_ReservesOpenHandle;
-
-
-/**
- * @brief Reserve open result details.
- */
-struct TALER_EXCHANGE_ReserveOpenResult
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
- /**
- * New expiration time
- */
- struct GNUNET_TIME_Timestamp expiration_time;
-
- /**
- * Actual cost of the open operation.
- */
- struct TALER_Amount open_cost;
-
- } ok;
-
-
- /**
- * Information returned if the payment provided is insufficient, if
- * @e hr.http_status is #MHD_HTTP_PAYMENT_REQUIRED
- */
- struct
- {
- /**
- * Current expiration time of the reserve.
- */
- struct GNUNET_TIME_Timestamp expiration_time;
-
- /**
- * Actual cost of the open operation that should have been paid.
- */
- struct TALER_Amount open_cost;
-
- } payment_required;
-
-
- /**
- * Information returned if KYC is required to proceed, set if
- * @e hr.http_status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
- /**
- * Requirement row that the merchant should use
- * to check for its KYC status.
- */
- uint64_t requirement_row;
-
- /**
- * Hash of the payto-URI of the account to KYC;
- */
- struct TALER_PaytoHashP h_payto;
-
- } unavailable_for_legal_reasons;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve open request to a exchange.
- *
- * @param cls closure
- * @param ror HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesOpenCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReserveOpenResult *ror);
-
-
-/**
- * Submit a request to open a reserve.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param keys exchange keys
- * @param reserve_priv private key of the reserve to open
- * @param reserve_contribution amount to pay from the reserve's balance for the operation
- * @param coin_payments_length length of the @a coin_payments array
- * @param coin_payments array of coin payments to use for opening the reserve
- * @param expiration_time desired new expiration time for the reserve
- * @param min_purses minimum number of purses to allow being concurrently opened per reserve
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesOpenHandle *
-TALER_EXCHANGE_reserves_open (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- struct TALER_EXCHANGE_Keys *keys,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const struct TALER_Amount *reserve_contribution,
- unsigned int coin_payments_length,
- const struct TALER_EXCHANGE_PurseDeposit coin_payments[
- static coin_payments_length],
- struct GNUNET_TIME_Timestamp expiration_time,
- uint32_t min_purses,
- TALER_EXCHANGE_ReservesOpenCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a reserve status request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param[in] roh the reserve open request handle
- */
-void
-TALER_EXCHANGE_reserves_open_cancel (
- struct TALER_EXCHANGE_ReservesOpenHandle *roh);
-
-
-/* ********************* /reserves/$RID/attest *********************** */
-
-
-/**
- * @brief A Get /reserves/$RID/attest Handle
- */
-struct TALER_EXCHANGE_ReservesGetAttestHandle;
-
-
-/**
- * @brief Reserve GET attest result details.
- */
-struct TALER_EXCHANGE_ReserveGetAttestResult
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
-
- /**
- * Length of the @e attributes array.
- */
- unsigned int attributes_length;
-
- /**
- * Array of attributes available about the user.
- */
- const char **attributes;
-
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve attest request to a exchange.
- *
- * @param cls closure
- * @param ror HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesGetAttestCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReserveGetAttestResult *ror);
-
-
-/**
- * Submit a request to get the list of attestable attributes for a reserve.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param reserve_pub public key of the reserve to get available attributes for
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesGetAttestHandle *
-TALER_EXCHANGE_reserves_get_attestable (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ReservePublicKeyP *reserve_pub,
- TALER_EXCHANGE_ReservesGetAttestCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a request to get attestable attributes. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param rgah the reserve get attestable request handle
- */
-void
-TALER_EXCHANGE_reserves_get_attestable_cancel (
- struct TALER_EXCHANGE_ReservesGetAttestHandle *rgah);
-
-
-/**
- * @brief A POST /reserves/$RID/attest Handle
- */
-struct TALER_EXCHANGE_ReservesPostAttestHandle;
-
-
-/**
- * @brief Reserve attest result details.
- */
-struct TALER_EXCHANGE_ReservePostAttestResult
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
- /**
- * Time when the exchange made the signature.
- */
- struct GNUNET_TIME_Timestamp exchange_time;
-
- /**
- * Expiration time of the attested attributes.
- */
- struct GNUNET_TIME_Timestamp expiration_time;
-
- /**
- * Signature by the exchange affirming the attributes.
- */
- struct TALER_ExchangeSignatureP exchange_sig;
-
- /**
- * Online signing key used by the exchange.
- */
- struct TALER_ExchangePublicKeyP exchange_pub;
-
- /**
- * Attributes being confirmed by the exchange.
- */
- const json_t *attributes;
-
- } ok;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve attest request to a exchange.
- *
- * @param cls closure
- * @param ror HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesPostAttestCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReservePostAttestResult *ror);
-
-
-/**
- * Submit a request to attest attributes about the owner of a reserve.
- *
- * @param ctx CURL context
- * @param url exchange base URL
- * @param reserve_priv private key of the reserve to attest
- * @param attributes_length length of the @a attributes array
- * @param attributes array of names of attributes to get attestations for
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesAttestHandle *
-TALER_EXCHANGE_reserves_attest (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- unsigned int attributes_length,
- const char *attributes[const static attributes_length],
- TALER_EXCHANGE_ReservesPostAttestCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a reserve attestation request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param rah the reserve attest request handle
- */
-void
-TALER_EXCHANGE_reserves_attest_cancel (
- struct TALER_EXCHANGE_ReservesAttestHandle *rah);
-
-
-/* ********************* /reserves/$RID/close *********************** */
-
-
-/**
- * @brief A /reserves/$RID/close Handle
- */
-struct TALER_EXCHANGE_ReservesCloseHandle;
-
-
-/**
- * @brief Reserve close result details.
- */
-struct TALER_EXCHANGE_ReserveCloseResult
-{
-
- /**
- * High-level HTTP response details.
- */
- struct TALER_EXCHANGE_HttpResponse hr;
-
- /**
- * Details depending on @e hr.http_status.
- */
- union
- {
-
- /**
- * Information returned on success, if
- * @e hr.http_status is #MHD_HTTP_OK
- */
- struct
- {
-
- /**
- * Amount wired to the target account.
- */
- struct TALER_Amount wire_amount;
- } ok;
-
- /**
- * Information returned if KYC is required to proceed, set if
- * @e hr.http_status is #MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS.
- */
- struct
- {
- /**
- * Requirement row that the merchant should use
- * to check for its KYC status.
- */
- uint64_t requirement_row;
-
- /**
- * Hash of the payto-URI of the account to KYC;
- */
- struct TALER_PaytoHashP h_payto;
-
- } unavailable_for_legal_reasons;
-
- } details;
-
-};
-
-
-/**
- * Callbacks of this type are used to serve the result of submitting a
- * reserve close request to a exchange.
- *
- * @param cls closure
- * @param ror HTTP response data
- */
-typedef void
-(*TALER_EXCHANGE_ReservesCloseCallback) (
- void *cls,
- const struct TALER_EXCHANGE_ReserveCloseResult *ror);
-
-
-/**
- * Submit a request to close a reserve.
- *
- * @param ctx curl context
- * @param url exchange base URL
- * @param reserve_priv private key of the reserve to close
- * @param target_payto_uri where to send the payment, NULL to send to reserve origin
- * @param cb the callback to call when a reply for this request is available
- * @param cb_cls closure for the above callback
- * @return a handle for this request; NULL if the inputs are invalid (i.e.
- * signatures fail to verify). In this case, the callback is not called.
- */
-struct TALER_EXCHANGE_ReservesCloseHandle *
-TALER_EXCHANGE_reserves_close (
- struct GNUNET_CURL_Context *ctx,
- const char *url,
- const struct TALER_ReservePrivateKeyP *reserve_priv,
- const char *target_payto_uri,
- TALER_EXCHANGE_ReservesCloseCallback cb,
- void *cb_cls);
-
-
-/**
- * Cancel a reserve status request. This function cannot be used
- * on a request handle if a response is already served for it.
- *
- * @param rch the reserve request handle
- */
-void
-TALER_EXCHANGE_reserves_close_cancel (
- struct TALER_EXCHANGE_ReservesCloseHandle *rch);
-
-#endif /* _TALER_EXCHANGE_SERVICE_H */
diff --git a/src/include/taler_exchangedb_lib.h b/src/include/taler_exchangedb_lib.h
@@ -1,199 +0,0 @@
-/*
- This file is part of TALER
- Copyright (C) 2014-2020 Taler Systems SA
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
-*/
-/**
- * @file include/taler_exchangedb_lib.h
- * @brief IO operations for the exchange's private keys
- * @author Florian Dold
- * @author Benedikt Mueller
- * @author Christian Grothoff
- */
-#ifndef TALER_EXCHANGEDB_LIB_H
-#define TALER_EXCHANGEDB_LIB_H
-
-#include "taler_signatures.h"
-#include "taler_exchangedb_plugin.h"
-#include "taler_bank_service.h"
-
-
-/**
- * Initialize the plugin.
- *
- * @param cfg configuration to use
- * @return NULL on failure
- */
-struct TALER_EXCHANGEDB_Plugin *
-TALER_EXCHANGEDB_plugin_load (const struct GNUNET_CONFIGURATION_Handle *cfg);
-
-
-/**
- * Shutdown the plugin.
- *
- * @param plugin plugin to unload
- */
-void
-TALER_EXCHANGEDB_plugin_unload (struct TALER_EXCHANGEDB_Plugin *plugin);
-
-/**
- * Information about an account from the configuration.
- */
-struct TALER_EXCHANGEDB_AccountInfo
-{
- /**
- * Authentication data. Only parsed if
- * #TALER_EXCHANGEDB_ALO_AUTHDATA was set.
- */
- const struct TALER_BANK_AuthenticationData *auth;
-
- /**
- * Section in the configuration file that specifies the
- * account. Must start with "exchange-account-".
- */
- const char *section_name;
-
- /**
- * Name of the wire method used by this account.
- */
- const char *method;
-
- /**
- * true if this account is enabed to be debited
- * by the taler-exchange-aggregator.
- */
- bool debit_enabled;
-
- /**
- * true if this account is enabed to be credited by wallets
- * and needs to be watched by the taler-exchange-wirewatch.
- * Also, the account will only be included in /wire if credit
- * is enabled.
- */
- bool credit_enabled;
-};
-
-
-/**
- * Calculate the total value of all transactions performed.
- * Stores @a off plus the cost of all transactions in @a tl
- * in @a ret.
- *
- * @param tl transaction list to process
- * @param off offset to use as the starting value
- * @param[out] ret where the resulting total is to be stored
- * @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGEDB_calculate_transaction_list_totals (
- struct TALER_EXCHANGEDB_TransactionList *tl,
- const struct TALER_Amount *off,
- struct TALER_Amount *ret);
-
-
-/**
- * Function called with information about a wire account.
- *
- * @param cls closure
- * @param ai account information
- */
-typedef void
-(*TALER_EXCHANGEDB_AccountCallback)(
- void *cls,
- const struct TALER_EXCHANGEDB_AccountInfo *ai);
-
-
-/**
- * Return information about all accounts that
- * were loaded by #TALER_EXCHANGEDB_load_accounts().
- *
- * @param cb callback to invoke
- * @param cb_cls closure for @a cb
- */
-void
-TALER_EXCHANGEDB_find_accounts (TALER_EXCHANGEDB_AccountCallback cb,
- void *cb_cls);
-
-
-/**
- * Find the wire plugin for the given payto:// URL.
- * Only useful after the accounts have been loaded
- * using #TALER_EXCHANGEDB_load_accounts().
- *
- * @param method wire method we need an account for
- * @return NULL on error
- */
-const struct TALER_EXCHANGEDB_AccountInfo *
-TALER_EXCHANGEDB_find_account_by_method (const char *method);
-
-
-/**
- * Find the wire plugin for the given payto:// URL
- * Only useful after the accounts have been loaded
- * using #TALER_EXCHANGEDB_load_accounts().
- *
- * @param url wire address we need an account for
- * @return NULL on error
- */
-const struct TALER_EXCHANGEDB_AccountInfo *
-TALER_EXCHANGEDB_find_account_by_payto_uri (const char *url);
-
-
-/**
- * Options for #TALER_EXCHANGEDB_load_accounts()
- */
-enum TALER_EXCHANGEDB_AccountLoaderOptions
-{
- TALER_EXCHANGEDB_ALO_NONE = 0,
-
- /**
- * Load accounts enabled for DEBITs.
- */
- TALER_EXCHANGEDB_ALO_DEBIT = 1,
-
- /**
- * Load accounts enabled for CREDITs.
- */
- TALER_EXCHANGEDB_ALO_CREDIT = 2,
-
- /**
- * Load authentication data from the
- * "taler-accountcredentials-" section
- * to access the account at the bank.
- */
- TALER_EXCHANGEDB_ALO_AUTHDATA = 4
-};
-
-
-/**
- * Load account information opf the exchange from
- * @a cfg.
- *
- * @param cfg configuration to load from
- * @param options loader options
- * @return #GNUNET_OK on success, #GNUNET_NO if no accounts are configured
- */
-enum GNUNET_GenericReturnValue
-TALER_EXCHANGEDB_load_accounts (
- const struct GNUNET_CONFIGURATION_Handle *cfg,
- enum TALER_EXCHANGEDB_AccountLoaderOptions options);
-
-
-/**
- * Free resources allocated by
- * #TALER_EXCHANGEDB_load_accounts().
- */
-void
-TALER_EXCHANGEDB_unload_accounts (void);
-
-#endif
diff --git a/src/lib/exchange_api_common.h b/src/lib/exchange_api_common.h
@@ -190,7 +190,7 @@ TALER_EXCHANGE_check_coin_conflict_ (
* @param keys keys to search
* @param[out] min set to the smallest amount
* @return #GNUNET_SYSERR if there are no denominations in @a keys
- */
+
enum GNUNET_GenericReturnValue
TALER_EXCHANGE_get_min_denomination_ (
const struct TALER_EXCHANGE_Keys *keys,