summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2021-05-15 16:05:52 +0200
committerChristian Grothoff <christian@grothoff.org>2021-05-15 16:05:52 +0200
commitd267f23fc695a99d95cbcffc4d35602ccef5c563 (patch)
tree3240a266258882312f1cddba1659f81762a3222c /core
parent60f61204fdfa89aa32abf0b916f05021ee89295e (diff)
downloaddocs-d267f23fc695a99d95cbcffc4d35602ccef5c563.tar.gz
docs-d267f23fc695a99d95cbcffc4d35602ccef5c563.tar.bz2
docs-d267f23fc695a99d95cbcffc4d35602ccef5c563.zip
more work on DD13 spec
Diffstat (limited to 'core')
-rw-r--r--core/api-common.rst64
-rw-r--r--core/api-exchange.rst256
-rw-r--r--core/api-merchant.rst4
3 files changed, 234 insertions, 90 deletions
diff --git a/core/api-common.rst b/core/api-common.rst
index 81b85ab9..cc69870b 100644
--- a/core/api-common.rst
+++ b/core/api-common.rst
@@ -64,6 +64,8 @@ handle the error as if an internal error (500) had been returned.
changed, the client MUST follow the link to the new location. If possible,
the client SHOULD remember the new URL for the reserve for future
requests.
+ :http:statuscode:`400 Bad request`:
+ One of the arguments to the request is missing or malformed.
:http:statuscode:`500 Internal server error`:
This always indicates some serious internal operational error of the exchange,
such as a program bug, database problems, etc., and must not be used for
@@ -75,10 +77,7 @@ handle the error as if an internal error (500) had been returned.
although the auditor API for this is not yet specified. However, as internal
server errors are always reported to the exchange operator, a good operator
should naturally be able to address them in a timely fashion, especially
- within 24h. When generating an internal server error, the exchange responds with
- a JSON object containing the following fields: FIXME: What are the fields?
- :http:statuscode:`400 Bad request`:
- One of the arguments to the request is missing or malformed.
+ within 24h.
Unless specified otherwise, all error status codes (4xx and 5xx) have a message
body with an `ErrorDetail` JSON object.
@@ -720,11 +719,6 @@ within the
struct TALER_MerchantPublicKeyP merchant;
};
-.. _TALER_RefreshCommitmentP:
-.. sourcecode:: c
-
- // FIXME: put definition here
-
.. _TALER_RefreshMeltCoinAffirmationPS:
.. sourcecode:: c
@@ -810,7 +804,6 @@ within the
struct GNUNET_HashCode h_wire_details;
};
-
.. _TALER_MasterWireFeePS:
.. sourcecode:: c
@@ -831,7 +824,7 @@ within the
struct TALER_DepositTrackPS {
/**
- * purpose.purpose = TALER_SIGNATURE_MASTER_SEPA_DETAILS || TALER_SIGNATURE_MASTER_TEST_DETAILS
+ * purpose.purpose = TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION
*/
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
struct GNUNET_HashCode h_contract_terms;
@@ -851,7 +844,6 @@ within the
struct TALER_AmountNBO deposit_fee;
};
-
.. _TALER_WireDepositDataPS:
.. _TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT:
.. sourcecode:: c
@@ -934,12 +926,31 @@ within the
.. _TALER_SIGNATURE_EXCHANGE_CONFIRM_REFUND:
.. sourcecode:: c
- // FIXME: put definition here
+ struct TALER_RefundConfirmationPS {
+ /**
+ * purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_REFUND.
+ */
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+ struct GNUNET_HashCode h_contract_terms;
+ struct TALER_CoinSpendPublicKeyP coin_pub;
+ struct TALER_MerchantPublicKeyP merchant;
+ uint64_t rtransaction_id;
+ struct TALER_AmountNBO refund_amount;
+ };
.. _TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION:
.. sourcecode:: c
- // FIXME: put definition here
+ struct TALER_DepositTrackPS {
+ /**
+ * purpose.purpose = TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION.
+ */
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+ struct GNUNET_HashCode h_contract_terms;
+ struct GNUNET_HashCode h_wire;
+ struct TALER_MerchantPublicKeyP merchant;
+ struct TALER_CoinSpendPublicKeyP coin_pub;
+ };
.. _TALER_RefundRequestPS:
.. sourcecode:: c
@@ -957,6 +968,9 @@ within the
struct TALER_AmountNBO refund_fee;
};
+.. _TALER_MerchantRefundConfirmationPS:
+.. sourcecode:: c
+
struct TALER_MerchantRefundConfirmationPS {
/**
* purpose.purpose = TALER_SIGNATURE_MERCHANT_REFUND_OK
@@ -986,7 +1000,6 @@ within the
.. sourcecode:: c
struct TALER_RecoupRefreshConfirmationPS {
-
/**
* purpose.purpose = TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP_REFRESH
*/
@@ -1105,6 +1118,26 @@ within the
struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
};
+.. _TALER_RefreshCommitmentP:
+.. sourcecode:: c
+
+ struct TALER_RefreshCommitmentP {
+ struct GNUNET_HashCode session_hash;
+ };
+
+
+.. _TALER_PurseRequestSignaturePS:
+.. sourcecode:: c
+
+ struct TALER_PurseRequestSignaturePS {
+ /**
+ * purpose.purpose = TALER_SIGNATURE_PURSE_REQUEST
+ */
+ struct GNUNET_CRYPTO_EccSignaturePurpose purpose;
+ struct GNUNET_TIME_AbsoluteNBO purse_expiration;
+ struct TALER_AmountNBO total_purse_amount;
+ struct GNUNET_HashCode h_contract_terms;
+ };
.. _TALER_PurseDepositSignaturePS:
@@ -1137,7 +1170,6 @@ within the
struct GNUNET_HashCode h_contract_terms;
};
-
.. _TALER_PurseMergeSignaturePS:
.. sourcecode:: c
diff --git a/core/api-exchange.rst b/core/api-exchange.rst
index 44dfd2a5..089890af 100644
--- a/core/api-exchange.rst
+++ b/core/api-exchange.rst
@@ -398,7 +398,8 @@ possibly by using HTTPS.
// ``payto://`` URI identifying the account and wire method
payto_uri: string;
- // Signature using the exchange's offline key
+ // Signature using the exchange's offline key over
+ // a `TALER_MasterWireDetailsPS`
// with purpose ``TALER_SIGNATURE_MASTER_WIRE_DETAILS``.
master_sig: EddsaSignature;
}
@@ -858,6 +859,7 @@ Management operations authorized by master key
payto_uri: string;
// Signature using the exchange's offline key
+ // over a `TALER_MasterWireDetailsPS`
// with purpose ``TALER_SIGNATURE_MASTER_WIRE_DETAILS``.
master_sig_wire: EddsaSignature;
@@ -964,8 +966,9 @@ This part of the API is for the use by auditors interacting with the exchange.
interface AuditorSignatureAddMessage {
- // Signature by the auditor.
- // Must have purpose ``TALER_SIGNATURE_AUDITOR_XXX``.
+ // Signature by the auditor over a
+ // `TALER_ExchangeKeyValidityPS`.
+ // Must have purpose ``TALER_SIGNATURE_AUDITOR_EXCHANGE_KEYS``.
auditor_sig: EddsaSignature;
}
@@ -1022,8 +1025,9 @@ exchange.
.. ts:def:: ReserveStatusRequest
interface ReserveStatusRequest {
- // Signature of type
- // TALER_SIGNATURE_RESERVE_STATUS_REQUEST
+ // Signature of purpose
+ // ``TALER_SIGNATURE_RESERVE_STATUS_REQUEST`` over
+ // a `TALER_ReserveStatusRequestSignaturePS`.
reserve_sig: EddsaSignature;
}
@@ -1072,7 +1076,8 @@ exchange.
request_timestamp: Timestamp;
// Signature created with the reserve's private key.
- // Must be of purpose TALER_SIGNATURE_RESERVE_HISTORY_REQUEST.
+ // Must be of purpose ``TALER_SIGNATURE_RESERVE_HISTORY_REQUEST`` over
+ // a `TALER_ReserveHistoryRequestSignaturePS`.
reserve_sig: EddsaSignature;
}
@@ -1096,7 +1101,8 @@ exchange.
h_wire: HashCode;
// Signature created with the reserve's private key.
- // Must be of purpose TALER_SIGNATURE_ACCOUNT_SETUP_REQUEST.
+ // Must be of purpose ``TALER_SIGNATURE_ACCOUNT_SETUP_REQUEST`` over
+ // a `TALER_AccountSetupRequestSignaturePS`.
reserve_sig: EddsaSignature;
}
@@ -1125,12 +1131,17 @@ exchange.
// Hash of the contract.
h_contract: HashCode;
+ // Hash of the wire details of the reserve.
+ h_wire: HashCode;
+
// Signature created with the reserve's private key.
- // Must be of purpose TALER_SIGNATURE_ACCOUNT_MERGE.
+ // Must be of purpose ``TALER_SIGNATURE_ACCOUNT_MERGE`` over
+ // a `TALER_AccountMergeSignaturePS`.
reserve_sig: EddsaSignature;
// Signature created with the purse's private key.
- // Must be of purpose TALER_SIGNATURE_PURSE_MERGE.
+ // Must be of purpose ``TALER_SIGNATURE_PURSE_MERGE``
+ // over a `TALER_PurseMergeSignaturePS`.
purse_sig: EddsaSignature;
// Deposit fees that were charged to the purse.
@@ -1151,8 +1162,9 @@ exchange.
// Hash of the blinded coin to be signed.
h_coin_envelope: HashCode;
- // Signature of ``TALER_WithdrawRequestPS`` created with the reserve's
- // private key.
+ // Signature over a `TALER_WithdrawRequestPS`
+ // with purpose ``TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW``
+ // created with the reserve's private key.
reserve_sig: EddsaSignature;
// Fee that is charged for withdraw.
@@ -1198,11 +1210,11 @@ exchange.
receiver_account_details: string;
// This is a signature over a
- // struct ``TALER_ReserveCloseConfirmationPS`` with purpose
+ // struct `TALER_ReserveCloseConfirmationPS` with purpose
// ``TALER_SIGNATURE_EXCHANGE_RESERVE_CLOSED``.
exchange_sig: EddsaSignature;
- // Public key used to create ``exchange_sig``.
+ // Public key used to create 'exchange_sig'.
exchange_pub: EddsaPublicKey;
// Time when the reserve was closed.
@@ -1219,11 +1231,11 @@ exchange.
amount: Amount;
// This is a signature over
- // a struct ``TALER_PaybackConfirmationPS`` with purpose
- // ``TALER_SIGNATURE_EXCHANGE_CONFIRM_PAYBACK``.
+ // a struct `TALER_RecoupConfirmationPS` with purpose
+ // ``TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP``.
exchange_sig: EddsaSignature;
- // Public key used to create ``exchange_sig``.
+ // Public key used to create 'exchange_sig'.
exchange_pub: EddsaPublicKey;
// Time when the funds were paid back into the reserve.
@@ -1262,7 +1274,8 @@ exchange.
interface ReserveHistoryRequest {
// Signature of type
- // TALER_SIGNATURE_RESERVE_HISTORY_REQUEST
+ // ``TALER_SIGNATURE_RESERVE_HISTORY_REQUEST``
+ // over a `TALER_ReserveHistoryRequestSignaturePS`.
reserve_sig: EddsaSignature;
// Time when the client made the request.
@@ -1332,7 +1345,8 @@ exchange.
coin_ev: CoinEnvelope;
// Signature of `TALER_WithdrawRequestPS` created with
- // the `reserves's private key <reserve-priv>`.
+ // the `reserves's private key <reserve-priv>`
+ // using purpose ``TALER_SIGNATURE_WALLET_RESERVE_WITHDRAW``.
reserve_sig: EddsaSignature;
}
@@ -1340,7 +1354,7 @@ exchange.
.. ts:def:: WithdrawResponse
interface WithdrawResponse {
- // The blinded RSA signature over the ``coin_ev``, affirms the coin's
+ // The blinded RSA signature over the 'coin_ev', affirms the coin's
// validity after unblinding.
ev_sig: BlindedRsaSignature;
@@ -1363,6 +1377,8 @@ exchange.
history: TransactionHistoryItem[]
}
+.. _delete-reserve:
+
.. http:DELETE:: /reserves/$RESERVE_PUB
Forcefully closes a reserve.
@@ -1432,7 +1448,6 @@ credited an amount specified in the deposit permission, possibly a fraction of
the total coin's value, minus the deposit fee as specified by the coin's
denomination.
-
.. _deposit:
.. http:POST:: /coins/$COIN_PUB/deposit
@@ -1445,10 +1460,9 @@ denomination.
exchange. The exchange MUST return a 307 or 308 redirection to the correct
base URL if this is the case.
- The request should contain a JSON object with the
- following fields:
+ **Request:**
- **Request:** The request body must be a `DepositRequest` object.
+ The request body must be a `DepositRequest` object.
**Response:**
@@ -1516,7 +1530,7 @@ denomination.
// exchange, possibly zero if refunds are not allowed.
refund_deadline: Timestamp;
- // Signature of `TALER_DepositRequestPS`, made by the customer with the
+ // Signature over `TALER_DepositRequestPS`, made by the customer with the
// `coin's private key <coin-priv>`.
coin_sig: EddsaSignature;
}
@@ -1604,14 +1618,16 @@ denomination.
// exchange, possibly zero if refunds are not allowed.
refund_deadline: Timestamp;
- // Signature by the coin.
+ // Signature over `TALER_DepositRequestPS`, made by the customer with the
+ // `coin's private key <coin-priv>`.
coin_sig: EddsaSignature;
// Hash of the bank account from where we received the funds.
h_wire: HashCode;
// Hash of the public denomination key used to sign the coin.
- // FIXME: why do we care to have this?
+ // Needed because 'coin_sig' signs over this, and
+ // that is important to fix the coin's denomination.
h_denom_pub: HashCode;
// Hash over the proposal data of the contract that
@@ -1631,7 +1647,9 @@ denomination.
// subtracting the amounts.
amount: Amount;
- // Signature by the coin.
+ // Signature by the coin over a
+ // `TALER_RefreshMeltCoinAffirmationPS` of
+ // purpose ``TALER_SIGNATURE_WALLET_COIN_MELT``.
coin_sig: EddsaSignature;
// Melt fee.
@@ -1641,7 +1659,8 @@ denomination.
rc: TALER_RefreshCommitmentP;
// Hash of the public denomination key used to sign the coin.
- // FIXME: why do we care to have this?
+ // Needed because 'coin_sig' signs over this, and
+ // that is important to fix the coin's denomination.
h_denom_pub: HashCode;
}
@@ -1658,7 +1677,7 @@ denomination.
// adding the amounts to the coin's denomination value.
amount: Amount;
- // Refund fee in case of type "REFUND".
+ // Refund fee.
refund_fee: Amount;
// Hash over the proposal data of the contract that
@@ -1668,7 +1687,9 @@ denomination.
// Refund transaction ID.
rtransaction_id: Integer;
- // `EdDSA Signature <eddsa-sig>` authorizing the REFUND. Made with
+ // `EdDSA Signature <eddsa-sig>` authorizing the REFUND over a
+ // `TALER_MerchantRefundConfirmationPS` with
+ // purpose ``TALER_SIGNATURE_MERCHANT_REFUND_OK``. Made with
// the `public key of the merchant <merchant-pub>`.
merchant_sig: EddsaSignature;
@@ -1689,11 +1710,14 @@ denomination.
// Date when the operation was made.
timestamp: Timestamp;
- // Signature by the coin.
+ // Signature by the coin over a
+ // `TALER_RecoupRequestPS` with purpose
+ // ``TALER_SIGNATURE_WALLET_COIN_RECOUP``.
coin_sig: EddsaSignature;
// Hash of the public denomination key used to sign the coin.
- // FIXME: why do we care to have this?
+ // Needed because 'coin_sig' signs over this, and
+ // that is important to fix the coin's denomination.
h_denom_pub: HashCode;
// Coin blinding key.
@@ -1702,11 +1726,12 @@ denomination.
// Reserve receiving the recoup.
reserve_pub: EddsaPublicKey;
- // Signature by the exchange, must be
- // of type TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP.
+ // Signature by the exchange over a
+ // `TALER_RecoupConfirmationPS`, must be
+ // of purpose ``TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP``.
exchange_sig: EddsaSignature;
- // Public key used to sign ``exchange_sig``
+ // Public key of the private key used to create 'exchange_sig'.
exchange_pub: EddsaPublicKey;
}
@@ -1725,11 +1750,12 @@ denomination.
// Date when the operation was made.
timestamp: Timestamp;
- // Signature by the exchange
- // of type TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP_REFRESH.
+ // Signature by the exchange over a
+ // `TALER_RecoupRefreshConfirmationPS`
+ // of purpose ``TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP_REFRESH``.
exchange_sig: EddsaSignature;
- // Public key used to sign ``exchange_sig``,
+ // Public key of the private key used to create 'exchange_sig'.
exchange_pub: EddsaPublicKey;
}
@@ -1749,21 +1775,24 @@ denomination.
// Date when the operation was made.
timestamp: Timestamp;
- // Signature by the coin.
+ // Signature by the coin over a `TALER_RecoupRequestPS`
+ // with purpose ``TALER_SIGNATURE_WALLET_COIN_RECOUP``.
coin_sig: EddsaSignature;
// Hash of the public denomination key used to sign the coin.
- // FIXME: why do we care to have this?
+ // Needed because 'coin_sig' signs over this, and
+ // that is important to fix the coin's denomination.
h_denom_pub: HashCode;
// Coin blinding key.
coin_blind: DenominationBlindingKeyP;
- // Signature by the exchange
- // of type TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP_REFRESH.
+ // Signature by the exchange over a
+ // `TALER_RecoupRefreshConfirmationPS`
+ // of purpose ``TALER_SIGNATURE_EXCHANGE_CONFIRM_RECOUP_REFRESH``.
exchange_sig: EddsaSignature;
- // Public key used to sign ``exchange_sig``,
+ // Public key used to sign 'exchange_sig'.
exchange_pub: EddsaPublicKey;
// Blinding factor of the revoked new coin.
@@ -1795,11 +1824,14 @@ denomination.
// Date when the purse was set to expire.
purse_expiration: Timestamp;
- // Signature by the coin.
+ // Signature by the coin over a
+ // `TALER_PurseDepositSignaturePS` of
+ // purpose ``TALER_SIGNATURE_PURSE_DEPOSIT``.
coin_sig: EddsaSignature;
// Hash of the public denomination key used to sign the coin.
- // FIXME: why do we care to have this?
+ // Needed because 'coin_sig' signs over this, and
+ // that is important to fix the coin's denomination.
h_denom_pub: HashCode;
}
@@ -2167,6 +2199,7 @@ in using this API.
interface RecoupWithdrawalConfirmation {
// Tag to distinguish the `RecoupConfirmation` response type.
refreshed: false;
+
// Public key of the reserve that will receive the recoup.
reserve_pub: EddsaPublicKey;
}
@@ -2176,6 +2209,7 @@ in using this API.
interface RecoupRefreshConfirmation {
// Tag to distinguish the `RecoupConfirmation` response type.
refreshed: true;
+
// Public key of the old coin that will receive the recoup.
old_coin_pub: EddsaPublicKey;
}
@@ -2250,7 +2284,8 @@ typically also view the balance.)
deposits: TrackTransferDetail[];
// Signature from the exchange made with purpose
- // `TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT`.
+ // ``TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT``
+ // over a `TALER_WireDepositDataPS`.
exchange_sig: EddsaSignature;
// Public EdDSA key of the exchange that was used to generate the signature.
@@ -2286,7 +2321,7 @@ typically also view the balance.)
**Request:**
- :query merchant_sig: EdDSA signature of the merchant made with purpose ``TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION``, affirming that it is really the merchant who requires obtaining the wire transfer identifier.
+ :query merchant_sig: EdDSA signature of the merchant made with purpose ``TALER_SIGNATURE_MERCHANT_TRACK_TRANSACTION`` over a `TALER_DepositTrackPS`, affirming that it is really the merchant who requires obtaining the wire transfer identifier.
**Response:**
@@ -2320,7 +2355,8 @@ typically also view the balance.)
// Total amount transferred.
total_amount: Amount;
- // Binary-only Signature_ for purpose `TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE`
+ // Binary-only Signature_ with purpose ``TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE``
+ // over a `TALER_ConfirmWirePS`
// whereby the exchange affirms the successful wire transfer.
exchange_sig: EddsaSignature;
@@ -2392,7 +2428,10 @@ Refunds
// EdDSA public key of the merchant.
merchant_pub: EddsaPublicKey;
- // EdDSA signature of the merchant affirming the refund.
+ // EdDSA signature of the merchant over a
+ // `TALER_RefundRequestPS` with purpose
+ // ``TALER_SIGNATURE_MERCHANT_REFUND``
+ // affirming the refund.
merchant_sig: EddsaPublicKey;
}
@@ -2402,7 +2441,9 @@ Refunds
interface RefundSuccess {
// The EdDSA :ref:`signature` (binary-only) with purpose
- // `TALER_SIGNATURE_EXCHANGE_CONFIRM_REFUND` using a current signing key of the
+ // ``TALER_SIGNATURE_EXCHANGE_CONFIRM_REFUND`` over
+ // a `TALER_RecoupRefreshConfirmationPS`
+ // using a current signing key of the
// exchange affirming the successful refund.
exchange_sig: EddsaSignature;
@@ -2500,7 +2541,10 @@ Wallet-to-wallet transfers
// SHA-512 hash of the contact of the purse.
h_contract_terms: HashCode;
- // EdDSA signature of the exchange affirming the purse status.
+ // EdDSA signature of the exchange over a
+ // `TALER_PurseStatusResponseSignaturePS`
+ // with purpose ``TALER_SIGNATURE_PURSE_STATUS_RESPONSE``
+ // affirming the purse status.
exchange_sig: EddsaSignature;
// EdDSA public key exchange used for 'exchange_sig'.
@@ -2523,7 +2567,9 @@ Wallet-to-wallet transfers
Deposit money into a purse. Endpoint used by the buyer.
- **Request:** The request body must be a `PurseRequest` object.
+ **Request:**
+
+ The request body must be a `PurseRequest` object.
**Response:**
@@ -2557,6 +2603,11 @@ Wallet-to-wallet transfers
In this case, the response is a `PurseDepositDoubleSpendError`.
If the value of all successful coins is below the purse fee,
the exchange may not setup the purse at all.
+ :http:statuscode:`425 Too Early`:
+ This response type is used if the given purse expiration time
+ is too far in the future (at least from the perspective
+ of the exchange). Thus, retrying at a later time may
+ succeed. The client should look at the ``Date:`` header of the response to see if a minor time difference is to blame and possibly adjust the request accordingly.
**Details:**
@@ -2565,7 +2616,10 @@ Wallet-to-wallet transfers
interface PurseRequest {
- // EdDSA signature of the purse confirming the key
+ // EdDSA signature of the purse over a
+ // `TALER_PurseRequestSignaturePS`
+ // of purpose ``TALER_SIGNATURE_PURSE_REQUEST``
+ // confirming the key
// invariants associated with the purse.
// (amount, h_contract_terms, expiration).
purse_sig: EddsaSignature;
@@ -2651,7 +2705,8 @@ Wallet-to-wallet transfers
total_deposit_fees: Amount;
// EdDSA signature of the exchange affirming the payment,
- // of purpose TALER_SIGNATURE_PURSE_DEPOSIT_CONFIRMED
+ // of purpose ``TALER_SIGNATURE_PURSE_DEPOSIT_CONFIRMED``
+ // over a `TALER_PurseDepositConfirmedSignaturePS`.
// Signs over the above and the purse public key and
// the hash of the contract terms.
exchange_sig: EddsaSignature;
@@ -2676,22 +2731,68 @@ Wallet-to-wallet transfers
.. ts:def:: PurseConflict
- interface PurseConflict {
+ // Union discriminated by the "type" field.
+ type PurseConflict =
+ | PurseMergeConflict
+ | PurseRequestConflict;
- // Total amount to be paid into the purse as per
- // the previous request.
- total_purse_amount: Amount;
+ .. ts:def:: PurseMergeConflict
+
+ interface PurseMergeConflict {
+ type: "MERGE";
// SHA-512 hash of the contact of the purse.
h_contract_terms: HashCode;
+ // Hash of the wire details of the reserve.
+ h_wire: HashCode;
+
+ // Reserve merging the purse.
+ reserve_pub: EddsaPublicKey;
+
// Indicative time by which the purse should expire
// if it has not been merged into an account. At this
// point, all of the deposits made should be
// auto-refunded.
purse_expiration: Timestamp;
- // EdDSA signature of the purse confirming that the
+ // When was the merge request generated.
+ merge_timestamp: Timestamp;
+
+ // Total amount to be merged into the reserve.
+ // (excludes fees).
+ purse_value_after_fees: Amount;
+
+ // EdDSA signature of the purse over
+ // `TALER_PurseMergeSignaturePS` of
+ // purpose ``TALER_SIGNATURE_PURSE_MERGE``
+ // confirming that the
+ // above details hold for this purse.
+ purse_sig: EddsaSignature;
+ }
+
+ .. ts:def:: PurseRequestConflict
+
+ interface PurseRequestConflict {
+ type: "REQUEST";
+
+ // SHA-512 hash of the contact of the purse.
+ h_contract_terms: HashCode;
+
+ // Indicative time by which the purse should expire
+ // if it has not been merged into an account. At this
+ // point, all of the deposits made should be
+ // auto-refunded.
+ purse_expiration: Timestamp;
+
+ // Total amount to be paid into the purse as per
+ // the previous request.
+ total_purse_amount: Amount;
+
+ // EdDSA signature of the purse over
+ // `TALER_PurseRequestSignaturePS` of
+ // purpose ``TALER_SIGNATURE_PURSE_REQUEST``
+ // confirming that the
// above details hold for this purse.
purse_sig: EddsaSignature;
@@ -2723,7 +2824,9 @@ Wallet-to-wallet transfers
Merge purse with account, adding the value of the purse into
the account. Endpoint to be used by the seller.
- **Request:** The request body must be a `MergeRequest` object.
+ **Request:**
+
+ The request body must be a `MergeRequest` object.
:query timeout_ms=NUMBER: *Optional.* If specified, the exchange will
wait up to ``timeout_ms`` milliseconds to receive payment before
@@ -2764,15 +2867,17 @@ Wallet-to-wallet transfers
interface MergeRequest {
// payto://-URI of the account the purse is to be merged into.
- // Must be of the form: "payto://taler/EXCHANGE_URL/RESERVE_PUB".
+ // Must be of the form: 'payto://taler/$EXCHANGE_URL/$RESERVE_PUB'.
payto_uri: string;
- // EdDSA signature of the account/reserve affirming the merge.
- // Must be of purpose TALER_SIGNATURE_ACCOUNT_MERGE
+ // EdDSA signature of the account/reserve affirming the merge
+ // over a `TALER_AccountMergeSignaturePS`.
+ // Must be of purpose ``TALER_SIGNATURE_ACCOUNT_MERGE``
reserve_sig: EddsaSignature;
- // EdDSA signature of the purse private key affirming the merge.
- // Must be of purpose TALER_SIGNATURE_PURSE_MERGE.
+ // EdDSA signature of the purse private key affirming the merge
+ // over a `TALER_PurseMergeSignaturePS`.
+ // Must be of purpose ``TALER_SIGNATURE_PURSE_MERGE``.
purse_sig: EddsaSignature;
// Minimum amount that must be credited to the reserve, that is
@@ -2814,7 +2919,8 @@ Wallet-to-wallet transfers
contract_time: Timestamp;
// EdDSA signature of the exchange affirming the merge of
- // purpose TALER_SIGNATURE_PURSE_MERGE_SUCCESS.
+ // purpose ``TALER_SIGNATURE_PURSE_MERGE_SUCCESS``
+ // over `TALER_PurseMergeSuccessSignaturePS`.
// Signs over the above and the account public key.
exchange_sig: EddsaSignature;
@@ -2877,17 +2983,18 @@ Wallet-to-wallet transfers
kyc_timestamp: Timestamp;
// Bank account to be associated with the account.
- // Can be ``payto://void/`` to not associate the
+ // Can be 'payto://void/' to not associate the
// account with any bank account. In this case,
// closing the account will result in the balance
// being forfeit. If the provided wire method is
- // not supported by the exchange *and* not ``void``,
+ // not supported by the exchange *and* not 'void',
// this is a ``Bad Request`` (HTTP status 400).
payto_uri: string;
// EdDSA signature of the reserve affirming the request
// to create the account, must be of purpose
- // TALER_SIGNATURE_ACCOUNT_SETUP_REQUEST
+ // ``TALER_SIGNATURE_ACCOUNT_SETUP_REQUEST``
+ // and over `TALER_AccountSetupRequestSignaturePS`.
reserve_sig: EddsaPublicKey;
}
@@ -2902,7 +3009,8 @@ Wallet-to-wallet transfers
// EdDSA signature of the exchange affirming the account
// is KYC'ed, must be of purpose
- // TALER_SIGNATURE_ACCOUNT_SETUP_SUCCESS.
+ // ``TALER_SIGNATURE_ACCOUNT_SETUP_SUCCESS``
+ // and over `TALER_AccountSetupRequestSignaturePS`.
exchange_sig: EddsaSignature;
// public key used to create the signature.
@@ -2983,7 +3091,7 @@ wallet-to-wallet payments. Only another exchange should access this endpoint.
amount: Amount;
// payto://-URI of the account the purse is to be merged into.
- // Must be of the form: "payto://taler/EXCHANGE_URL/RESERVE_PUB".
+ // Must be of the form: 'payto://taler/EXCHANGE_URL/RESERVE_PUB'.
payto_uri: string;
// Purse public key.
@@ -3000,11 +3108,13 @@ wallet-to-wallet payments. Only another exchange should access this endpoint.
merge_timestamp: Timestamp;
// Signature created with the reserve's private key.
- // Must be of purpose TALER_SIGNATURE_ACCOUNT_MERGE
+ // Must be of purpose ``TALER_SIGNATURE_ACCOUNT_MERGE``
+ // and over `TALER_AccountMergeSignaturePS`.
reserve_sig: EddsaSignature;
// Signature created with the purse's private key.
- // Must be of purpose TALER_SIGNATURE_PURSE_MERGE
+ // Must be of purpose ``TALER_SIGNATURE_PURSE_MERGE``
+ // and over `TALER_PurseMergeSignaturePS`.
purse_sig: EddsaSignature;
// Deposit fees that were charged to the purse.
diff --git a/core/api-merchant.rst b/core/api-merchant.rst
index 21956e5d..c9d9ca5e 100644
--- a/core/api-merchant.rst
+++ b/core/api-merchant.rst
@@ -1542,11 +1542,13 @@ Creating orders
:ts:type:`PostOrderResponse`.
:http:statuscode:`404 Not found`:
Possible reasons are:
+
(1) The order given used products from the inventory, but those were
not found in the inventory.
(2) The merchant instance is unknown (including possibly the instance
being not configured for new orders).
(3) The wire method specified is not supported by the backend.
+
Details in the error code.
NOTE: currently the client has no good way to find out which product
is not in the inventory, we MAY want to specify that in the reply.
@@ -1624,7 +1626,7 @@ Creating orders
fulfillment_url?: string;
}
- The following `ProductSpecification` can be provided if the parts of the
+ The following `MinimalInventoryProduct` can be provided if the parts of the
order are inventory-based, that is if the `PostOrderRequest` uses
``inventory_products``. For such products, which must be in the backend's inventory,
the backend can automatically fill in the amount and other details about