gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-exchange] branch master updated: -work on P2P payment details


From: gnunet
Subject: [taler-exchange] branch master updated: -work on P2P payment details
Date: Thu, 02 Jun 2022 21:55:24 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 04c32eaf -work on P2P payment details
04c32eaf is described below

commit 04c32eafb9194727876469c92b7cbedc008c51ec
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu Jun 2 21:55:21 2022 +0200

    -work on P2P payment details
---
 src/exchange/taler-exchange-httpd_responses.c | 56 ++++++++++++++++++++++++++-
 src/exchangedb/exchange-0001-part.sql         |  2 +-
 src/exchangedb/plugin_exchangedb_postgres.c   | 25 ++++++++----
 src/include/taler_exchange_service.h          |  6 +++
 src/include/taler_exchangedb_plugin.h         |  6 +++
 src/lib/exchange_api_common.c                 | 20 ++++++++--
 6 files changed, 102 insertions(+), 13 deletions(-)

diff --git a/src/exchange/taler-exchange-httpd_responses.c 
b/src/exchange/taler-exchange-httpd_responses.c
index 40e702bd..450a9bab 100644
--- a/src/exchange/taler-exchange-httpd_responses.c
+++ b/src/exchange/taler-exchange-httpd_responses.c
@@ -361,7 +361,7 @@ TEH_RESPONSE_compile_transaction_history (
            hash and the denomination key's RSA signature over coin_pub, but as
            the wallet should really already have this information (and cannot
            check or do anything with it anyway if it doesn't), it seems
-           strictly unnecessary. *///
+           strictly unnecessary. */
         if (0 !=
             json_array_append_new (
               history,
@@ -420,6 +420,56 @@ TEH_RESPONSE_compile_transaction_history (
         }
         break;
       }
+
+#if FIXME_PURSE_REFUND
+    case TALER_EXCHANGEDB_TT_PURSE_REFUND:
+      {
+        struct TALER_EXCHANGEDB_PurseRefundListEntry *pr
+          = pos->details.purse_refund;
+        struct TALER_ExchangePublicKeyP epub;
+        struct TALER_ExchangeSignatureP esig;
+
+        if (TALER_EC_NONE !=
+            TALER_exchange_online_purse_refund_sign (
+              &TEH_keys_exchange_sign_,
+              &pr->amount,
+              &pr->refund_fee,
+              &pr->purse_share_fee,
+              &pr->purse_pub,
+              coin_pub,
+              &epub,
+              &esig))
+        {
+          GNUNET_break (0);
+          json_decref (history);
+          return NULL;
+        }
+        if (0 !=
+            json_array_append_new (
+              history,
+              GNUNET_JSON_PACK (
+                GNUNET_JSON_pack_string ("type",
+                                         "PURSE-REFUND"),
+                TALER_JSON_pack_amount ("amount",
+                                        &pd->amount),
+                TALER_JSON_pack_amount ("refund_fee",
+                                        &pd->refund_fee),
+                TALER_JSON_pack_amount ("purse_share_fee",
+                                        &pd->purse_share_fee),
+                GNUNET_JSON_pack_data_auto ("purse_pub",
+                                            &pd->purse_pub),
+                GNUNET_JSON_pack_data_auto ("exchange_sig",
+                                            &esig),
+                GNUNET_JSON_pack_data_auto ("exchange_pub",
+                                            &epub))))
+        {
+          GNUNET_break (0);
+          json_decref (history);
+          return NULL;
+        }
+        break;
+      }
+#endif
     }
   }
   return history;
@@ -797,7 +847,9 @@ TEH_RESPONSE_compile_reserve_history (
                 TALER_JSON_pack_amount ("amount",
                                         &amount),
                 TALER_JSON_pack_amount ("purse_fee",
-                                        &merge->purse_fee))))
+                                        &merge->purse_fee),
+                GNUNET_JSON_pack_bool ("merged",
+                                       merge->merged))))
         {
           GNUNET_break (0);
           json_decref (json_history);
diff --git a/src/exchangedb/exchange-0001-part.sql 
b/src/exchangedb/exchange-0001-part.sql
index 9b9828fe..52a16cd9 100644
--- a/src/exchangedb/exchange-0001-part.sql
+++ b/src/exchangedb/exchange-0001-part.sql
@@ -3464,7 +3464,7 @@ BEGIN
    SET
     current_balance_frac=current_balance_frac-in_history_fee_frac
        + CASE
-         WHEN reserve_frac < in_history_fee_frac
+         WHEN current_balance_frac < in_history_fee_frac
          THEN 100000000
          ELSE 0
          END,
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index 61e16d30..83f99f46 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -2157,6 +2157,8 @@ prepare_statements (struct PostgresClosure *pg)
       "SELECT"
       " pr.amount_with_fee_val"
       ",pr.amount_with_fee_frac"
+      ",pr.balance_val"
+      ",pr.balance_frac"
       ",pr.purse_fee_val"
       ",pr.purse_fee_frac"
       ",pr.h_contract_terms"
@@ -6515,9 +6517,12 @@ add_p2p_merge (void *cls,
     merge = GNUNET_new (struct TALER_EXCHANGEDB_PurseMerge);
     {
       uint32_t flags32;
+      struct TALER_Amount balance;
       struct GNUNET_PQ_ResultSpec rs[] = {
         TALER_PQ_RESULT_SPEC_AMOUNT ("purse_fee",
                                      &merge->purse_fee),
+        TALER_PQ_RESULT_SPEC_AMOUNT ("balance",
+                                     &balance),
         TALER_PQ_RESULT_SPEC_AMOUNT ("amount_with_fee",
                                      &merge->amount_with_fee),
         GNUNET_PQ_result_spec_timestamp ("merge_timestamp",
@@ -6550,15 +6555,21 @@ add_p2p_merge (void *cls,
         return;
       }
       merge->flags = (enum TALER_WalletAccountMergeFlags) flags32;
+      if ( (! GNUNET_TIME_absolute_is_future (
+              merge->merge_timestamp.abs_time)) &&
+           (-1 != TALER_amount_cmp (&balance,
+                                    &merge->amount_with_fee)) )
+        merge->merged = true;
     }
+    if (merge->merged)
+      GNUNET_assert (0 <=
+                     TALER_amount_add (&rhc->balance_in,
+                                       &rhc->balance_in,
+                                       &merge->amount_with_fee));
     GNUNET_assert (0 <=
-                   TALER_amount_add (&rhc->balance_in,
-                                     &rhc->balance_in,
-                                     &merge->amount_with_fee));
-    GNUNET_assert (0 <=
-                   TALER_amount_subtract (&rhc->balance_out,
-                                          &rhc->balance_out,
-                                          &merge->purse_fee));
+                   TALER_amount_add (&rhc->balance_out,
+                                     &rhc->balance_out,
+                                     &merge->purse_fee));
     merge->reserve_pub = *rhc->reserve_pub;
     tail = append_rh (rhc);
     tail->type = TALER_EXCHANGEDB_RO_PURSE_MERGE;
diff --git a/src/include/taler_exchange_service.h 
b/src/include/taler_exchange_service.h
index 2577aaf3..7e44698f 100644
--- a/src/include/taler_exchange_service.h
+++ b/src/include/taler_exchange_service.h
@@ -1535,6 +1535,12 @@ struct TALER_EXCHANGE_ReserveHistoryEntry
        */
       enum TALER_WalletAccountMergeFlags flags;
 
+      /**
+       * True if the purse was actually merged, false
+       * if only the @e purse_fee was charged.
+       */
+      bool merged;
+
     } merge_details;
 
   } details;
diff --git a/src/include/taler_exchangedb_plugin.h 
b/src/include/taler_exchangedb_plugin.h
index 8866e6f4..0bc53e1e 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -1144,6 +1144,12 @@ struct TALER_EXCHANGEDB_PurseMerge
    */
   enum TALER_WalletAccountMergeFlags flags;
 
+  /**
+   * true if the purse was actually successfully merged,
+   * false if the @e purse_fee was charged but the
+   * @e amount was not credited to the reserve.
+   */
+  bool merged;
 };
 
 
diff --git a/src/lib/exchange_api_common.c b/src/lib/exchange_api_common.c
index cfab9a30..78dea63e 100644
--- a/src/lib/exchange_api_common.c
+++ b/src/lib/exchange_api_common.c
@@ -417,6 +417,8 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry *rh,
                                 &rh->details.merge_details.merge_timestamp),
     GNUNET_JSON_spec_timestamp ("purse_expiration",
                                 &rh->details.merge_details.purse_expiration),
+    GNUNET_JSON_spec_bool ("merged",
+                           &rh->details.merge_details.merged),
     GNUNET_JSON_spec_end ()
   };
 
@@ -447,10 +449,22 @@ parse_merge (struct TALER_EXCHANGE_ReserveHistoryEntry 
*rh,
     GNUNET_break_op (0);
     return GNUNET_SYSERR;
   }
+  if (rh->details.merge_details.merged)
+  {
+    if (0 >
+        TALER_amount_add (uc->total_in,
+                          uc->total_in,
+                          &rh->amount))
+    {
+      /* overflow in history already!? inconceivable! Bad exchange! */
+      GNUNET_break_op (0);
+      return GNUNET_SYSERR;
+    }
+  }
   if (0 >
-      TALER_amount_add (uc->total_in,
-                        uc->total_in,
-                        &rh->amount))
+      TALER_amount_add (uc->total_out,
+                        uc->total_out,
+                        &rh->details.merge_details.purse_fee))
   {
     /* overflow in history already!? inconceivable! Bad exchange! */
     GNUNET_break_op (0);

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]