From 39d282dd80b334549cb85975c0dfd633226aece6 Mon Sep 17 00:00:00 2001 From: swrup Date: Thu, 4 Dec 2025 18:25:05 +0100 Subject: [PATCH] + DenomGroup --- src/api.ml | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 4 deletions(-) diff --git a/src/api.ml b/src/api.ml index 19b615cb..01e37c8b 100644 --- a/src/api.ml +++ b/src/api.ml @@ -925,8 +925,10 @@ module RecoupDenoms = struct |> finish end -module DenomCommon = struct +module RsaDenom = struct + (* correspond to: ({ rsa_pub: RsaPublicKey;} & DenomCommon) *) type t = { + rsa_pub: RsaPublicKey.t; master_sig: DenominationKeyValidityPS.t; stamp_start: Timestamp.t; stamp_expire_withdraw: Timestamp.t; @@ -936,9 +938,10 @@ module DenomCommon = struct } let jsont = - let make master_sig stamp_start stamp_expire_withdraw stamp_expire_deposit - stamp_expire_legal lost = + let make rsa_pub master_sig stamp_start stamp_expire_withdraw + stamp_expire_deposit stamp_expire_legal lost = { + rsa_pub; master_sig; stamp_start; stamp_expire_withdraw; @@ -947,6 +950,7 @@ module DenomCommon = struct lost; } in + let rsa_pub v = v.rsa_pub in let master_sig v = v.master_sig in let stamp_start v = v.stamp_start in let stamp_expire_withdraw v = v.stamp_expire_withdraw in @@ -954,7 +958,8 @@ module DenomCommon = struct let stamp_expire_legal v = v.stamp_expire_legal in let lost v = v.lost in let open Jsont.Object in - map ~kind:"DenomCommon" make + map ~kind:"RsaDenom" make + |> mem "rsa_pub" RsaPublicKey.jsont ~enc:rsa_pub |> mem "master_sig" DenominationKeyValidityPS.jsont ~enc:master_sig |> mem "stamp_start" Timestamp.jsont ~enc:stamp_start |> mem "stamp_expire_withdraw" Timestamp.jsont ~enc:stamp_expire_withdraw @@ -963,3 +968,53 @@ module DenomCommon = struct |> mem "lost" (Jsont.option Jsont.bool) ~enc:lost |> finish end + +module RsaDenomGroup = struct + type t = { + denoms: RsaDenom.t list; + value: Amount.t; + fee_withdraw: Amount.t; + fee_deposit: Amount.t; + fee_refresh: Amount.t; + fee_refund: Amount.t; + } + + let jsont = + let make denoms value fee_withdraw fee_deposit fee_refresh fee_refund = + { denoms; value; fee_withdraw; fee_deposit; fee_refresh; fee_refund } + in + let denoms v = v.denoms in + let value v = v.value in + let fee_withdraw v = v.fee_withdraw in + let fee_deposit v = v.fee_deposit in + let fee_refresh v = v.fee_refresh in + let fee_refund v = v.fee_refund in + let open Jsont.Object in + map ~kind:"RsaDenomGroup" make + |> mem "denoms" (Jsont.list RsaDenom.jsont) ~enc:denoms + |> mem "value" Amount.jsont ~enc:value + |> mem "fee_withdraw" Amount.jsont ~enc:fee_withdraw + |> mem "fee_deposit" Amount.jsont ~enc:fee_deposit + |> mem "fee_refresh" Amount.jsont ~enc:fee_refresh + |> mem "fee_refund" Amount.jsont ~enc:fee_refund + |> finish +end + +(* TODO better jsont cases + factorize common fields (DenomCommon/DenomGroupCommon) + "+age_restricted"/CS variants + raise error not implemented if not RSA *) +module DenomGroup = struct + type t = Rsa of RsaDenomGroup.t + + let of_rsa v = Rsa v + + let jsont = + let open Jsont.Object in + let rsa = Case.map "RSA" RsaDenomGroup.jsont ~dec:of_rsa in + let enc_case = function Rsa v -> Case.value rsa v in + let cases = Case.[ make rsa ] in + map ~kind:"DenomGroup" Fun.id + |> case_mem "cipher" Jsont.string ~enc:Fun.id ~enc_case cases + |> finish +end