diff options
| author | Christian Grothoff <christian@grothoff.org> | 2022-04-25 13:11:13 +0200 | 
|---|---|---|
| committer | Christian Grothoff <christian@grothoff.org> | 2022-04-25 13:11:13 +0200 | 
| commit | 94038bfcfd58a958016e3e40c1ffeba70c53dc57 (patch) | |
| tree | 82aef2cc9a04ac3328b08b0f55c723e0db0c9eca /src | |
| parent | b4965db0d26a85787e1fd430e1591c50f8dd1279 (diff) | |
-sketch implementation of exchange_do_reserve_purse()
Diffstat (limited to 'src')
| -rw-r--r-- | src/exchangedb/exchange-0001-part.sql | 124 | 
1 files changed, 122 insertions, 2 deletions
diff --git a/src/exchangedb/exchange-0001-part.sql b/src/exchangedb/exchange-0001-part.sql index 9a546216..ab80be96 100644 --- a/src/exchangedb/exchange-0001-part.sql +++ b/src/exchangedb/exchange-0001-part.sql @@ -2722,10 +2722,130 @@ CREATE OR REPLACE FUNCTION exchange_do_reserve_purse(    OUT out_conflict BOOLEAN)  LANGUAGE plpgsql  AS $$ +DECLARE +  my_purses_active INT8; +DECLARE +  my_purses_allowed INT8; +DECLARE +  my_balance_val INT8; +DECLARE +  my_balance_frac INT4; +DECLARE +  my_kyc_passed BOOLEAN;  BEGIN -  -- FIXME: implement! -  out_conflict=TRUE; + +-- Store purse merge signature, checks for purse_pub uniqueness +INSERT INTO purse_merges +    (partner_serial_id +    ,reserve_pub +    ,purse_pub +    ,merge_sig +    ,merge_timestamp) +  VALUES +    (0 +    ,in_reserve_pub +    ,in_purse_pub +    ,in_merge_sig +    ,in_merge_timestamp) +  ON CONFLICT DO NOTHING; + +IF NOT FOUND +THEN +  -- Idempotency check: see if an identical record exists. +  -- Note that by checking 'merge_sig', we implicitly check +  -- identity over everything that the signature covers. +  PERFORM +  FROM purse_merges +  WHERE purse_pub=in_purse_pub +     AND merge_sig=in_merge_sig; +  IF NOT FOUND +  THEN +     -- Purse was merged, but to some other reserve. Not allowed. +     out_conflict=TRUE; +     RETURN; +  END IF; + +  -- "success" +  out_conflict=FALSE; +  out_no_funds=FALSE; +  RETURN; +END IF; +out_conflict=FALSE; + + +-- Charge reserve for purse creation. +-- FIXME: Use different type of purse +-- signature in this case, so that we +-- can properly account for the purse +-- fees when auditing!!! +SELECT +  purses_active + ,purses_allowed + ,kyc_passed + ,current_balance_val + ,current_balance_frac +INTO +  my_purses_active + ,my_purses_allowed + ,my_kyc_passed + ,my_balance_val + ,my_balance_frac +FROM reserves +WHERE reserve_pub=in_reserve_pub; + +IF NOT FOUND +THEN +  out_no_funds=TRUE; +  -- FIXME: be more specific in the returned +  -- error that we don't know the reserve +  -- (instead of merely saying it has no funds) +  RETURN; +END IF; + +IF NOT my_kyc_passed +THEN +  -- FIXME: might want to categorically disallow +  -- purse creation without KYC (depending on +  -- exchange settings => new argument?) +END IF; + +IF ( (my_purses_active >= my_purses_allowed) AND +     ( (my_balance_val < in_purse_fee_val) OR +       ( (my_balance_val <= in_purse_fee_val) AND +         (my_balance_frac < in_purse_fee_frac) ) ) ) +THEN    out_no_funds=TRUE; +  RETURN; +END IF; + +IF (my_purses_active < my_purses_allowed) +THEN +  my_purses_active = my_purses_active + 1; +ELSE +  -- FIXME: See above: we should probably have +  -- very explicit wallet-approval in the +  -- signature to charge the reserve! +  my_balance_val = my_balance_val - in_purse_fee_val; +  IF (my_balance_frac > in_purse_fee_frac) +  THEN +    my_balance_frac = my_balance_frac - in_purse_fee_frac; +  ELSE +    my_balance_val = my_balance_val - 1; +    my_balance_frac = my_balance_frac + 100000000 - in_purse_fee_frac; +  END IF; +END IF; + +UPDATE reserves SET +  gc_date=min_reserve_gc + ,current_balance_val=my_balance_val + ,current_balance_frac=my_balance_frac + ,purses_active=my_purses_active + ,kyc_required=TRUE +WHERE +  reserves.reserve_pub=rpub; + +out_no_funds=FALSE; +  END $$;  | 
