From 0e965eccc888d307ce7974f5ad2fcd9c69347c0e Mon Sep 17 00:00:00 2001 From: swrup Date: Mon, 23 Feb 2026 09:02:39 +0100 Subject: [PATCH] --- src/denomination.ml | 73 ++++++++++++++++++++++++++++++++++++++ src/http_info.ml | 85 ++++++++++++--------------------------------- 2 files changed, 96 insertions(+), 62 deletions(-) diff --git a/src/denomination.ml b/src/denomination.ml index 28622e9c..ec5f7905 100644 --- a/src/denomination.ml +++ b/src/denomination.ml @@ -15,3 +15,76 @@ type t = { h_pub: denom_hash; master_sig: Signatures.DenominationKeyValidity.t; } + +let make_denom_group denominations = + let open Syntax in + let ht = Hashtbl.create 0xff in + List.iter + (fun coin -> + let open Config.Coin in + assert (coin.cipher = `RSA); + let k = + ( coin.value, + coin.fee_withdraw, + coin.fee_deposit, + coin.fee_refresh, + coin.fee_refund ) + in + let v = [] in + Hashtbl.replace ht k v) + Config.Coin.all_coins; + let+ () = + list_iter + (fun { + pub; + value; + stamp_start; + stamp_expire_withdraw; + stamp_expire_deposit; + stamp_expire_legal; + fee_withdraw; + fee_deposit; + fee_refresh; + fee_refund; + age_mask= _; + h_pub= _; + master_sig; + } -> + let k = (value, fee_withdraw, fee_deposit, fee_refresh, fee_refund) in + let v = + Api.RsaDenom. + { + rsa_pub= pub; + master_sig; + stamp_start; + stamp_expire_withdraw; + stamp_expire_deposit; + stamp_expire_legal; + lost= None; + } + in + let+ l = + match Hashtbl.find_opt ht k with + | None -> + Error "denomination does not match any coin in configuration" + | Some l -> Ok l + in + Hashtbl.replace ht k (v :: l)) + denominations + in + Hashtbl.to_seq ht + |> List.of_seq + |> List.map + (fun + ((value, fee_withdraw, fee_deposit, fee_refresh, fee_refund), denoms) + -> + Api.DenomGroup.Rsa + Api.RsaDenomGroup. + { + denoms; + value; + fee_withdraw; + fee_deposit; + fee_refresh; + fee_refund; + }) diff --git a/src/http_info.ml b/src/http_info.ml index f7043ff8..e2f5ee73 100644 --- a/src/http_info.ml +++ b/src/http_info.ml @@ -20,44 +20,6 @@ let config req _server _env = let res = Api.encode Api.ExchangeVersionResponse.jsont config in Respond.result res req -(* TODO - for now we only have one item in each "denom group" - change this once we have denom/signkey rotation *) -let denomgroup_of_denomdata - Denomination. - { - pub; - value; - stamp_start; - stamp_expire_withdraw; - stamp_expire_deposit; - stamp_expire_legal; - fee_withdraw; - fee_deposit; - fee_refresh; - fee_refund; - age_mask= _; - h_pub= _; - master_sig; - } = - let denoms = - [ - RsaDenom. - { - rsa_pub= pub; - master_sig; - stamp_start; - stamp_expire_withdraw; - stamp_expire_deposit; - stamp_expire_legal; - lost= None; - }; - ] - in - DenomGroup.Rsa - RsaDenomGroup. - { denoms; value; fee_withdraw; fee_deposit; fee_refresh; fee_refund } - let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date = let version = Api.protocol_version in let base_url = Config.base_url in @@ -96,40 +58,39 @@ let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date = let wallet_balance_limit_without_kyc = None in let hard_limits = [] in let zero_limits = [] in - let* dn_l = - let+ l = Keys.denominations () in + let* denom_l = Keys.denominations () in + let denom_l = (* reverse chronological order *) List.sort (fun a b -> Stdlib.compare b.Denomination.stamp_start a.stamp_start) - l + denom_l in let list_issue_date = - match dn_l with + match denom_l with | [] -> Timestamp.never | dn :: _ -> dn.Denomination.stamp_start in - let denominations = + let denom_l = (* if `?last_issue_date` query param does not exactly match the `stamp_start` of one of the denomination keys, all keys are returned *) - let open Denomination in - let l = - match last_issue_date with - | None -> dn_l - | Some last_issue_date -> ( - match - List.find_opt - (fun v -> Timestamp.compare v.stamp_start last_issue_date = 0) - dn_l - with - | None -> dn_l - | Some _ -> - List.filter - (fun v -> - Time.Timestamp.compare v.stamp_start last_issue_date >= 0) - dn_l) - in - List.map denomgroup_of_denomdata l + match last_issue_date with + | None -> denom_l + | Some last_issue_date -> ( + match + List.find_opt + (fun v -> + Timestamp.compare v.Denomination.stamp_start last_issue_date = 0) + denom_l + with + | None -> denom_l + | Some _ -> + List.filter + (fun v -> + Timestamp.compare v.Denomination.stamp_start last_issue_date + >= 0) + denom_l) in + let* denominations = Denomination.make_denom_group denom_l in let* signkeys = let+ l = Keys.signkeys () in @@ -151,7 +112,7 @@ let mk_keys ~db_conn (module Keys : Keys.S) ~last_issue_date = contatentation of all of the master_sigs (in reverse chronological order by group) in the arrays under "denominations". *) let hc = - dn_l + denom_l |> List.map (fun dn -> dn.Denomination.master_sig) |> List.map Signatures.DenominationKeyValidity.to_octets |> String.concat ""