gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: experiment


From: gnunet
Subject: [taler-exchange] branch master updated: experiment
Date: Mon, 13 Dec 2021 12:28:35 +0100

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 bf54ee30 experiment
bf54ee30 is described below

commit bf54ee30d4727217264f470321cc2f91facf63cc
Author: Christian Grothoff <grothoff@gnunet.org>
AuthorDate: Mon Dec 13 12:28:28 2021 +0100

    experiment
---
 src/exchangedb/withdraw.sql | 130 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 130 insertions(+)

diff --git a/src/exchangedb/withdraw.sql b/src/exchangedb/withdraw.sql
new file mode 100644
index 00000000..0ac9a73f
--- /dev/null
+++ b/src/exchangedb/withdraw.sql
@@ -0,0 +1,130 @@
+CREATE OR REPLACE FUNCTION exchange_do_withdraw(
+  IN amount_val INT8,
+  IN amount_frac INT4,
+  IN h_denom_pub BYTEA,
+  IN rpub BYTEA,
+  IN reserve_sig BYTEA,
+  IN h_coin_envelope BYTEA,
+  IN denom_sig BYTEA,
+  IN now INT8,
+  IN min_reserve_gc INT8,
+  OUT reserve_found BOOLEAN,
+  OUT balance_ok BOOLEAN,
+  OUT kycok BOOLEAN,
+  OUT ruuid INT8,
+  OUT account_uuid INT8)
+LANGUAGE plpgsql
+AS $$
+DECLARE
+  reserve_gc INT8;
+DECLARE
+  denom_serial INT8;
+DECLARE
+  reserve_val INT8;
+DECLARE
+  reserve_frac INT4;
+BEGIN
+
+
+SELECT denominations_serial INTO denom_serial
+  FROM denominations
+ WHERE denom_pub_hash=h_denom_pub;
+
+IF NOT FOUND
+THEN
+  -- denomination unknown, should be impossible!
+  reserve_found=FALSE;
+  balance_ok=FALSE;
+  kycok=FALSE;
+  ruuid=0;
+  account_uuid=0;
+  ASSERT false, 'denomination unknown';
+  RETURN;
+END IF;
+
+
+UPDATE reserves SET
+   gc_date=GREATEST(gc_date, min_reserve_gc)
+  ,current_balance_val=current_balance_val - amount_val
+     - CASE WHEN (current_balance_frac < amount_frac)
+         THEN 1
+         ELSE 0
+       END
+  ,current_balance_frac=current_balance_frac - amount_frac
+     + CASE WHEN (current_balance_frac < amount_frac)
+         THEN 100000000
+         ELSE 0
+       END
+ WHERE reserves.reserve_pub=rpub
+   AND ( (current_balance_val > amount_val) OR
+         ( (current_balance_val = amount_val) AND
+           (current_balance_frac >= amount_frac) ) );
+
+balance_ok=FOUND;
+
+-- Obtain KYC status based on the last wire transfer into
+-- this reserve. FIXME: likely not adequate for reserves that got P2P 
transfers!
+SELECT
+   kyc_ok
+  ,wire_source_serial_id
+  ,reserve_uuid
+  INTO
+   kycok
+  ,account_uuid
+  ,ruuid
+  FROM reserves 
+  JOIN reserves_in USING (reserve_uuid)
+  JOIN wire_targets ON (wire_source_serial_id = wire_target_serial_id)
+ WHERE reserves.reserve_pub=rpub
+ LIMIT 1; -- limit 1 should not be required (without p2p transfers)
+
+IF NOT FOUND
+THEN
+  -- reserve unknown
+  reserve_found=FALSE;
+  balance_ok=FALSE;
+  kycok=FALSE;
+  account_uuid=0;
+  RETURN;
+END IF;
+
+reserve_found=TRUE;
+
+
+-- We optimistically insert, and then on conflict declare
+-- the query successful due to idempotency.
+INSERT INTO reserves_out
+  (h_blind_ev
+  ,denominations_serial
+  ,denom_sig
+  ,reserve_uuid
+  ,reserve_sig
+  ,execution_date
+  ,amount_with_fee_val
+  ,amount_with_fee_frac)
+VALUES
+  (h_coin_envelope
+  ,denom_serial
+  ,denom_sig
+  ,ruuid
+  ,reserve_sig
+  ,now
+  ,amount_val
+  ,amount_frac)
+ON CONFLICT DO NOTHING;
+
+IF NOT FOUND
+THEN
+  -- idempotent query, all constraints must be satisfied
+  balance_ok=TRUE;
+  -- rollback any potential balance update we may have made
+  ROLLBACK;
+  START TRANSACTION ISOLATION LEVEL SERIALIZABLE;
+  RETURN;
+END IF;
+
+END $$;
+
+COMMENT ON FUNCTION exchange_do_withdraw(INT8, INT4, BYTEA, BYTEA, BYTEA, 
BYTEA, BYTEA, INT8, INT8)
+  IS 'Checks whether the reserve has sufficient balance for a withdraw 
operation (or the request is repeated and was previously approved) and if so 
updates the database with the result';
+

-- 
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]