From d192e442b315f525bb96ad5df6616510e75249e5 Mon Sep 17 00:00:00 2001 From: swrup Date: Thu, 11 Dec 2025 05:41:32 +0100 Subject: [PATCH] --- src/api.ml | 8 ++++---- src/handler.ml | 13 +++++++++++++ src/management.ml | 48 +++++++++++++++++++++++++++++++++++++++++++++++ src/mte.ml | 2 ++ src/pg.ml | 33 ++++++++++++++++++++++++++++++-- 5 files changed, 98 insertions(+), 6 deletions(-) diff --git a/src/api.ml b/src/api.ml index c3377f43..09f1c9e9 100644 --- a/src/api.ml +++ b/src/api.ml @@ -572,8 +572,8 @@ module WireFeeSetupMessage = struct Signature using the exchange's offline key with purpose TALER_SIGNATURE_MASTER_WIRE_FEES *) master_sig_wire: MasterWireFee.t; - fee_start: Amount.t; - fee_end: Amount.t; + fee_start: Timestamp.t; + fee_end: Timestamp.t; closing_fee: Amount.t; wire_fee: Amount.t; } @@ -599,8 +599,8 @@ module WireFeeSetupMessage = struct map ~kind:"WireFeeSetupMessage" make |> mem "wire_method" Jsont.string ~enc:wire_method |> mem "master_sig_wire" MasterWireFee.jsont ~enc:master_sig_wire - |> mem "fee_start" Amount.jsont ~enc:fee_start - |> mem "fee_end" Amount.jsont ~enc:fee_end + |> mem "fee_start" Timestamp.jsont ~enc:fee_start + |> mem "fee_end" Timestamp.jsont ~enc:fee_end |> mem "closing_fee" Amount.jsont ~enc:closing_fee |> mem "wire_fee" Amount.jsont ~enc:wire_fee |> finish diff --git a/src/handler.ml b/src/handler.ml index 091a33fc..c997be05 100644 --- a/src/handler.ml +++ b/src/handler.ml @@ -113,3 +113,16 @@ let management_auditors_disable req auditor_pub server _env = Ok "" in respond_with_res res req + +let management_wirefee_jsont = WireFeeSetupMessage.jsont + +let management_wirefee req server _env = + let open Management in + let db_conn = Vif.Server.device Devices.db_connection server in + let res = + let* v = Vif.Request.of_json req |> unwrap_err_msg in + let* () = verify_wirefee_setup_sig v in + let* () = update_wirefee_setup ~db_conn v in + Ok "" + in + respond_with_res res req diff --git a/src/management.ml b/src/management.ml index e44c1943..97aac9f8 100644 --- a/src/management.ml +++ b/src/management.ml @@ -296,3 +296,51 @@ let auditor_disable ~db_conn auditor_pub |> unwrap_err_caqti in () + +let verify_wirefee_setup_sig + WireFeeSetupMessage. + { + wire_method; + master_sig_wire; + fee_start; + fee_end; + closing_fee; + wire_fee; + } = + let open Bin_sig.MasterWireFee in + verify ~key:Config.Exchange.master_public_key master_sig_wire + { + h_wire_method= Bin_type.Hash_64_cstr.hash wire_method; + start_date= fee_start; + end_date= fee_end; + wire_fee; + closing_fee; + } + +let update_wirefee_setup ~db_conn + WireFeeSetupMessage. + { + wire_method; + master_sig_wire; + fee_start; + fee_end; + closing_fee; + wire_fee; + } = + let* fees_opt = + Pg.lookup_wirefee_by_time db_conn ~wire_method ~start_date:fee_start + ~end_date:fee_end + |> unwrap_err_caqti + in + match fees_opt with + | Some (_wire_fee, _closing_fee) -> + Error "wire-fee already setup? wire-fee mismatch" + | None -> + let+ () = + Pg.insert_wirefee db_conn ~wire_method ~start_date:fee_start + ~end_date:fee_end ~wire_fee ~closing_fee ~master_sig:master_sig_wire + |> unwrap_err_caqti + in + () + +(*[@@@ocaml.warning "-27"]*) diff --git a/src/mte.ml b/src/mte.ml index b330574c..15a764a6 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -49,6 +49,8 @@ let routes = (v "management" / "auditors" /% string `Path / "disable") management_auditors_disable_jsont --> management_auditors_disable; + post (v "management" / "wire-fee") management_wirefee_jsont + --> management_wirefee; ] let () = diff --git a/src/pg.ml b/src/pg.ml index a02efab9..536ee475 100644 --- a/src/pg.ml +++ b/src/pg.ml @@ -32,6 +32,9 @@ module Caqti_type = struct let eddsa_pub = EddsaPublicKey.caqti let eddsa_sig = EddsaSignature.caqti + (* todo: enum type for wire_method? *) + let wire_method = Caqti_type.string + include struct (* alias for hash *) @@ -183,8 +186,7 @@ let insert_signkey_revocation = let lookup_auditor_timestamp = let lookup_auditor_timestamp = Caqti_type.(eddsa_pub ->? time) - "lookup_auditor_timestamp SELECT last_change FROM auditors WHERE \ - auditor_pub=$1" + "SELECT last_change FROM auditors WHERE auditor_pub=$1" in fun (module Conn : CONN) auditor_pub -> Conn.find_opt lookup_auditor_timestamp auditor_pub @@ -218,3 +220,30 @@ let update_auditor = -> Conn.exec update_auditor (auditor_pub, auditor_url, auditor_name, enabled, change_date) + +let lookup_wirefee_by_time = + let lookup_wirefee_by_time = + Caqti_type.(t3 wire_method time time ->? t2 amount amount) + "SELECT (wire_fee).*, (closing_fee).* FROM wire_fee WHERE wire_method=$1 \ + AND end_date > $2 AND start_date < $3" + in + fun (module Conn : CONN) ~wire_method ~start_date ~end_date -> + Conn.find_opt lookup_wirefee_by_time (wire_method, start_date, end_date) + +let insert_wirefee = + let insert_wirefee = + let master_sig = Bin_sig.MasterWireFee.caqti in + Caqti_type.(t6 wire_method time time amount amount master_sig ->. unit) + "INSERT INTO wire_fee (wire_method, start_date, end_date, wire_fee, \ + closing_fee, master_sig) VALUES ($1, $2, $3, ($4,$5), ($6,$7), $8)" + in + fun (module Conn : CONN) + ~wire_method + ~start_date + ~end_date + ~wire_fee + ~closing_fee + ~master_sig + -> + Conn.exec insert_wirefee + (wire_method, start_date, end_date, wire_fee, closing_fee, master_sig)