2025-11-21 19:14:14 +01:00
|
|
|
(* TODO
|
|
|
|
|
number
|
|
|
|
|
- number is "float", but we probably want int everywhere instead
|
|
|
|
|
- numeric values capped at 2^53 -1 inclusive because json
|
|
|
|
|
time
|
|
|
|
|
- better types
|
|
|
|
|
- issues with "never" = uint64_max *)
|
2025-11-21 19:07:36 +01:00
|
|
|
open Crypto
|
2025-12-03 16:19:11 +01:00
|
|
|
open Bin_signature
|
2025-10-03 18:14:17 +02:00
|
|
|
|
|
|
|
|
let encode_exn jsont v = Jsont_bytesrw.encode_string jsont v |> Result.get_ok
|
|
|
|
|
let encode jsont v = Jsont_bytesrw.encode_string jsont v
|
|
|
|
|
let decode jsont v = Jsont_bytesrw.decode_string jsont v
|
|
|
|
|
|
2025-10-07 15:08:35 +02:00
|
|
|
module ErrorDetail = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
(* TODO GANA error codes
|
|
|
|
|
https://git.gnunet.org/gana.git/tree/gnu-taler-error-codes/registry.rec *)
|
|
|
|
|
type t = {
|
|
|
|
|
code: int;
|
|
|
|
|
hint: string option;
|
|
|
|
|
}
|
2025-10-03 18:14:17 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make code hint = { code; hint } in
|
|
|
|
|
let enc_code v = v.code in
|
|
|
|
|
let enc_hint v = v.hint in
|
|
|
|
|
Jsont.Object.map ~kind:"ErrorDetail" make
|
|
|
|
|
|> Jsont.Object.mem "code" Jsont.int ~enc:enc_code
|
|
|
|
|
|> Jsont.Object.opt_mem "hint" Jsont.(string) ~enc:enc_hint
|
|
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|
|
|
|
|
|
2025-12-04 17:16:41 +01:00
|
|
|
module B32 = struct
|
|
|
|
|
include B32
|
|
|
|
|
|
|
|
|
|
let jsont = Jsont.of_of_string ~kind:"B32" B32.decode ~enc:B32.encode
|
|
|
|
|
end
|
|
|
|
|
|
2025-11-28 14:00:11 +01:00
|
|
|
module HashCode : sig
|
|
|
|
|
type t
|
2025-11-28 13:40:37 +01:00
|
|
|
|
2025-11-28 14:00:11 +01:00
|
|
|
val hash : string -> t
|
|
|
|
|
val jsont : t Jsont.t
|
|
|
|
|
end = struct
|
|
|
|
|
type t = B32.t
|
2025-11-28 13:40:37 +01:00
|
|
|
|
2025-11-28 14:00:11 +01:00
|
|
|
let hash s =
|
2025-11-28 19:17:25 +01:00
|
|
|
let open Digestif.SHA512 in
|
2025-11-28 14:00:11 +01:00
|
|
|
s |> digest_string |> to_raw_string
|
2025-11-21 19:09:46 +01:00
|
|
|
|
2025-12-04 17:16:41 +01:00
|
|
|
let jsont = B32.jsont
|
2025-11-21 19:09:46 +01:00
|
|
|
end
|
|
|
|
|
|
2025-10-07 15:08:35 +02:00
|
|
|
module RelativeTime = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
type t =
|
|
|
|
|
| Microseconds of float
|
|
|
|
|
| Forever
|
2025-10-03 18:44:35 +02:00
|
|
|
|
|
|
|
|
let number_or_forever_jsont =
|
|
|
|
|
let forever =
|
|
|
|
|
let dec s =
|
|
|
|
|
match s with
|
|
|
|
|
| "forever" -> Forever
|
|
|
|
|
| _ -> Jsont.Error.msg Jsont.Meta.none "unexpected string value"
|
|
|
|
|
in
|
|
|
|
|
let enc = function Forever -> "forever" | _ -> assert false in
|
|
|
|
|
Jsont.map ~dec ~enc Jsont.string
|
|
|
|
|
in
|
|
|
|
|
let number =
|
|
|
|
|
let dec n = Microseconds n in
|
|
|
|
|
let enc = function Microseconds n -> n | _ -> assert false in
|
|
|
|
|
Jsont.map ~dec ~enc Jsont.number
|
|
|
|
|
in
|
|
|
|
|
let enc = function Forever -> forever | Microseconds _ -> number in
|
|
|
|
|
Jsont.any ~dec_string:forever ~dec_number:number ~enc ()
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make t_s = t_s in
|
|
|
|
|
Jsont.Object.map ~kind:"RelativeTime" make
|
|
|
|
|
|> Jsont.Object.mem "t_s" number_or_forever_jsont ~enc:Fun.id
|
|
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|
2025-10-03 19:54:18 +02:00
|
|
|
|
2025-10-07 15:08:35 +02:00
|
|
|
module RsaDenominationKey = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
type t = {
|
|
|
|
|
age_mask: int;
|
|
|
|
|
rsa_pub: RsaPublicKey.t;
|
|
|
|
|
}
|
2025-10-06 19:51:56 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make age_mask rsa_pub = { age_mask; rsa_pub } in
|
|
|
|
|
let age_mask v = v.age_mask in
|
|
|
|
|
let rsa_pub v = v.rsa_pub in
|
|
|
|
|
Jsont.Object.map ~kind:"RsaDenominationKey" make
|
|
|
|
|
|> Jsont.Object.mem "age_mask" Jsont.int ~enc:age_mask
|
2025-10-16 10:18:22 +02:00
|
|
|
|> Jsont.Object.mem "rsa_pub" RsaPublicKey.jsont ~enc:rsa_pub
|
2025-10-06 19:51:56 +02:00
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|
|
|
|
|
|
2025-11-30 22:44:36 +01:00
|
|
|
(* ! Clause Schnorr cipher is not supported *)
|
2025-10-07 15:08:35 +02:00
|
|
|
module CSDenominationKey = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
type t = {
|
|
|
|
|
age_mask: int;
|
2025-11-30 22:44:36 +01:00
|
|
|
cs_pub: B32.t;
|
2025-11-21 19:14:14 +01:00
|
|
|
}
|
2025-10-06 19:51:56 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make age_mask cs_pub = { age_mask; cs_pub } in
|
|
|
|
|
let age_mask v = v.age_mask in
|
|
|
|
|
let cs_pub v = v.cs_pub in
|
|
|
|
|
Jsont.Object.map ~kind:"CSDenominationKey" make
|
|
|
|
|
|> Jsont.Object.mem "age_mask" Jsont.int ~enc:age_mask
|
2025-12-04 17:16:41 +01:00
|
|
|
|> Jsont.Object.mem "cs_pub" B32.jsont ~enc:cs_pub
|
2025-10-06 19:51:56 +02:00
|
|
|
|> Jsont.Object.finish
|
|
|
|
|
end
|
|
|
|
|
|
2025-10-07 15:08:35 +02:00
|
|
|
module DenominationKey = struct
|
2025-11-30 22:44:36 +01:00
|
|
|
type t = Rsa of RsaDenominationKey.t
|
|
|
|
|
(*| CS of CSDenominationKey.t*)
|
|
|
|
|
|
|
|
|
|
let to_octets = function Rsa denom -> RsaPublicKey.to_octets denom.rsa_pub
|
2025-10-06 19:51:56 +02:00
|
|
|
|
2025-11-30 22:44:36 +01:00
|
|
|
let of_cs _v =
|
|
|
|
|
Jsont.Error.msg Jsont.Meta.none "CSDenominationKey are not supported"
|
|
|
|
|
|
|
|
|
|
let of_rsa v = Rsa v
|
2025-10-06 19:51:56 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let open Jsont.Object in
|
2025-11-30 22:44:36 +01:00
|
|
|
let rsa = Case.map "RSA" RsaDenominationKey.jsont ~dec:of_rsa in
|
|
|
|
|
let cs = Case.map "CS" CSDenominationKey.jsont ~dec:of_cs in
|
|
|
|
|
let enc_case = function Rsa v -> Case.value rsa v in
|
2025-10-06 19:51:56 +02:00
|
|
|
let cases = Case.[ make rsa; make cs ] in
|
|
|
|
|
map ~kind:"DenominationKey" Fun.id
|
|
|
|
|
|> case_mem "cipher" Jsont.string ~enc:Fun.id ~enc_case cases
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-10-06 22:20:09 +02:00
|
|
|
|
2025-10-07 15:08:35 +02:00
|
|
|
module FutureSignKey = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
type t = {
|
|
|
|
|
key: EddsaPublicKey.t;
|
|
|
|
|
stamp_start: Timestamp.t;
|
|
|
|
|
stamp_expire: Timestamp.t;
|
|
|
|
|
stamp_end: Timestamp.t;
|
2025-12-03 16:19:11 +01:00
|
|
|
signkey_secmod_sig: SigningKeyAnnouncementPS.t;
|
2025-11-21 19:14:14 +01:00
|
|
|
}
|
2025-10-06 22:20:09 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make key stamp_start stamp_expire stamp_end signkey_secmod_sig =
|
|
|
|
|
{ key; stamp_start; stamp_expire; stamp_end; signkey_secmod_sig }
|
|
|
|
|
in
|
|
|
|
|
let key v = v.key in
|
|
|
|
|
let stamp_start v = v.stamp_start in
|
|
|
|
|
let stamp_expire v = v.stamp_expire in
|
|
|
|
|
let stamp_end v = v.stamp_end in
|
|
|
|
|
let signkey_secmod_sig v = v.signkey_secmod_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"FutureSignKey" make
|
2025-10-13 00:02:35 +02:00
|
|
|
|> mem "key" EddsaPublicKey.jsont ~enc:key
|
2025-10-06 22:20:09 +02:00
|
|
|
|> mem "stamp_start" Timestamp.jsont ~enc:stamp_start
|
|
|
|
|
|> mem "stamp_expire" Timestamp.jsont ~enc:stamp_expire
|
|
|
|
|
|> mem "stamp_end" Timestamp.jsont ~enc:stamp_end
|
2025-12-03 16:19:11 +01:00
|
|
|
|> mem "signkey_secmod_sig" SigningKeyAnnouncementPS.jsont
|
|
|
|
|
~enc:signkey_secmod_sig
|
2025-10-06 22:20:09 +02:00
|
|
|
|> finish
|
|
|
|
|
end
|
2025-10-18 20:04:32 +02:00
|
|
|
|
|
|
|
|
module FutureDenom = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
type t = {
|
|
|
|
|
section_name: string;
|
|
|
|
|
value: Amount.t;
|
|
|
|
|
stamp_start: Timestamp.t;
|
|
|
|
|
stamp_expire_withdraw: Timestamp.t;
|
|
|
|
|
stamp_expire_deposit: Timestamp.t;
|
|
|
|
|
stamp_expire_legal: Timestamp.t;
|
|
|
|
|
denom_pub: DenominationKey.t;
|
|
|
|
|
fee_withdraw: Amount.t;
|
|
|
|
|
fee_deposit: Amount.t;
|
|
|
|
|
fee_refresh: Amount.t;
|
|
|
|
|
fee_refund: Amount.t;
|
2025-12-03 16:19:11 +01:00
|
|
|
denom_secmod_sig: DenominationKeyAnnouncementPS.t;
|
2025-11-21 19:14:14 +01:00
|
|
|
}
|
2025-10-18 20:04:32 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make section_name value stamp_start stamp_expire_withdraw
|
|
|
|
|
stamp_expire_deposit stamp_expire_legal denom_pub fee_withdraw
|
|
|
|
|
fee_deposit fee_refresh fee_refund denom_secmod_sig =
|
|
|
|
|
{
|
|
|
|
|
section_name;
|
|
|
|
|
value;
|
|
|
|
|
stamp_start;
|
|
|
|
|
stamp_expire_withdraw;
|
|
|
|
|
stamp_expire_deposit;
|
|
|
|
|
stamp_expire_legal;
|
|
|
|
|
denom_pub;
|
|
|
|
|
fee_withdraw;
|
|
|
|
|
fee_deposit;
|
|
|
|
|
fee_refresh;
|
|
|
|
|
fee_refund;
|
|
|
|
|
denom_secmod_sig;
|
|
|
|
|
}
|
|
|
|
|
in
|
|
|
|
|
let section_name t = t.section_name in
|
|
|
|
|
let value t = t.value in
|
|
|
|
|
let stamp_start t = t.stamp_start in
|
|
|
|
|
let stamp_expire_withdraw t = t.stamp_expire_withdraw in
|
|
|
|
|
let stamp_expire_deposit t = t.stamp_expire_deposit in
|
|
|
|
|
let stamp_expire_legal t = t.stamp_expire_legal in
|
|
|
|
|
let denom_pub t = t.denom_pub in
|
|
|
|
|
let fee_withdraw t = t.fee_withdraw in
|
|
|
|
|
let fee_deposit t = t.fee_deposit in
|
|
|
|
|
let fee_refresh t = t.fee_refresh in
|
|
|
|
|
let fee_refund t = t.fee_refund in
|
|
|
|
|
let denom_secmod_sig t = t.denom_secmod_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"FutureDenom" make
|
|
|
|
|
|> mem "section_name" Jsont.string ~enc:section_name
|
|
|
|
|
|> mem "value" Amount.jsont ~enc:value
|
|
|
|
|
|> mem "stamp_start" Timestamp.jsont ~enc:stamp_start
|
|
|
|
|
|> mem "stamp_expire_withdraw" Timestamp.jsont ~enc:stamp_expire_withdraw
|
|
|
|
|
|> mem "stamp_expire_deposit" Timestamp.jsont ~enc:stamp_expire_deposit
|
|
|
|
|
|> mem "stamp_expire_legal" Timestamp.jsont ~enc:stamp_expire_legal
|
|
|
|
|
|> mem "denom_pub" DenominationKey.jsont ~enc:denom_pub
|
|
|
|
|
|> 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
|
2025-12-03 16:19:11 +01:00
|
|
|
|> mem "denom_secmod_sig" DenominationKeyAnnouncementPS.jsont
|
2025-11-30 22:44:36 +01:00
|
|
|
~enc:denom_secmod_sig
|
2025-10-18 20:04:32 +02:00
|
|
|
|> finish
|
|
|
|
|
end
|
2025-10-18 20:12:51 +02:00
|
|
|
|
|
|
|
|
module FutureKeysResponse = struct
|
2025-11-21 19:14:14 +01:00
|
|
|
type t = {
|
|
|
|
|
future_denoms: FutureDenom.t list;
|
|
|
|
|
future_signkeys: FutureSignKey.t list;
|
|
|
|
|
master_pub: EddsaPublicKey.t;
|
|
|
|
|
denom_secmod_public_key: EddsaPublicKey.t;
|
|
|
|
|
signkey_secmod_public_key: EddsaPublicKey.t;
|
|
|
|
|
}
|
2025-10-18 20:12:51 +02:00
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make future_denoms future_signkeys master_pub denom_secmod_public_key
|
|
|
|
|
signkey_secmod_public_key =
|
|
|
|
|
{
|
|
|
|
|
future_denoms;
|
|
|
|
|
future_signkeys;
|
|
|
|
|
master_pub;
|
|
|
|
|
denom_secmod_public_key;
|
|
|
|
|
signkey_secmod_public_key;
|
|
|
|
|
}
|
|
|
|
|
in
|
|
|
|
|
let future_denoms t = t.future_denoms in
|
|
|
|
|
let future_signkeys t = t.future_signkeys in
|
|
|
|
|
let master_pub t = t.master_pub in
|
|
|
|
|
let denom_secmod_public_key t = t.denom_secmod_public_key in
|
|
|
|
|
let signkey_secmod_public_key t = t.signkey_secmod_public_key in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"FutureKeysResponse" make
|
|
|
|
|
|> mem "future_denoms" (Jsont.list FutureDenom.jsont) ~enc:future_denoms
|
|
|
|
|
|> mem "future_signkeys"
|
|
|
|
|
(Jsont.list FutureSignKey.jsont)
|
|
|
|
|
~enc:future_signkeys
|
|
|
|
|
|> mem "master_pub" EddsaPublicKey.jsont ~enc:master_pub
|
|
|
|
|
|> mem "denom_secmod_public_key" EddsaPublicKey.jsont
|
|
|
|
|
~enc:denom_secmod_public_key
|
|
|
|
|
|> mem "signkey_secmod_public_key" EddsaPublicKey.jsont
|
|
|
|
|
~enc:signkey_secmod_public_key
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-11-28 13:40:37 +01:00
|
|
|
|
|
|
|
|
module SignKeySignature = struct
|
|
|
|
|
type t = {
|
|
|
|
|
key: EddsaPublicKey.t;
|
2025-12-03 16:19:11 +01:00
|
|
|
master_sig: ExchangeSigningKeyValidityPS.t;
|
2025-11-28 13:40:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make key master_sig = { key; master_sig } in
|
|
|
|
|
let key v = v.key in
|
|
|
|
|
let master_sig v = v.master_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"SignKeySignature" make
|
|
|
|
|
|> mem "key" EddsaPublicKey.jsont ~enc:key
|
2025-12-03 16:19:11 +01:00
|
|
|
|> mem "master_sig" ExchangeSigningKeyValidityPS.jsont ~enc:master_sig
|
2025-11-28 13:40:37 +01:00
|
|
|
|> finish
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
module DenomSignature = struct
|
|
|
|
|
type t = {
|
|
|
|
|
h_denom_pub: HashCode.t;
|
2025-12-03 16:19:11 +01:00
|
|
|
master_sig: DenominationKeyValidityPS.t;
|
2025-11-28 13:40:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make h_denom_pub master_sig = { h_denom_pub; master_sig } in
|
|
|
|
|
let h_denom_pub v = v.h_denom_pub in
|
|
|
|
|
let master_sig v = v.master_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"DenomSignature" make
|
|
|
|
|
|> mem "h_denom_pub" HashCode.jsont ~enc:h_denom_pub
|
2025-12-03 16:19:11 +01:00
|
|
|
|> mem "master_sig" DenominationKeyValidityPS.jsont ~enc:master_sig
|
2025-11-28 13:40:37 +01:00
|
|
|
|> finish
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
module MasterSignatures = struct
|
|
|
|
|
type t = {
|
|
|
|
|
denom_sigs: DenomSignature.t list;
|
|
|
|
|
signkey_sigs: SignKeySignature.t list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make denom_sigs signkey_sigs = { denom_sigs; signkey_sigs } in
|
|
|
|
|
let denom_sigs v = v.denom_sigs in
|
|
|
|
|
let signkey_sigs v = v.signkey_sigs in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"MasterSignatures" make
|
|
|
|
|
|> mem "denom_sigs" (Jsont.list DenomSignature.jsont) ~enc:denom_sigs
|
|
|
|
|
|> mem "signkey_sigs" (Jsont.list SignKeySignature.jsont) ~enc:signkey_sigs
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 16:08:50 +01:00
|
|
|
|
|
|
|
|
module DenomRevocationSignature = struct
|
|
|
|
|
type t = { master_sig: MasterDenominationKeyRevocationPS.t }
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make master_sig = { master_sig } in
|
|
|
|
|
let enc v = v.master_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"DenomRevocationSignature" make
|
|
|
|
|
|> mem "master_sig" MasterDenominationKeyRevocationPS.jsont ~enc
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
module SignkeyRevocationSignature = struct
|
|
|
|
|
type t = { master_sig: MasterSigningKeyRevocationPS.t }
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make master_sig = { master_sig } in
|
|
|
|
|
let enc v = v.master_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"SignkeyRevocationSignature" make
|
|
|
|
|
|> mem "master_sig" MasterSigningKeyRevocationPS.jsont ~enc
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 16:19:10 +01:00
|
|
|
|
|
|
|
|
module AuditorSetupMessage = struct
|
|
|
|
|
type t = {
|
|
|
|
|
auditor_url: string;
|
|
|
|
|
auditor_name: string;
|
|
|
|
|
auditor_pub: EddsaPublicKey.t;
|
|
|
|
|
master_sig: MasterAddAuditorPS.t;
|
|
|
|
|
(* TODO time
|
|
|
|
|
something about using monotonic system time here! *)
|
|
|
|
|
validity_start: Timestamp.t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make auditor_url auditor_name auditor_pub master_sig validity_start =
|
|
|
|
|
{ auditor_url; auditor_name; auditor_pub; master_sig; validity_start }
|
|
|
|
|
in
|
|
|
|
|
let auditor_url v = v.auditor_url in
|
|
|
|
|
let auditor_name v = v.auditor_name in
|
|
|
|
|
let auditor_pub v = v.auditor_pub in
|
|
|
|
|
let master_sig v = v.master_sig in
|
|
|
|
|
let validity_start v = v.validity_start in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"AuditorSetupMessage" make
|
|
|
|
|
|> mem "auditor_url" Jsont.string ~enc:auditor_url
|
|
|
|
|
|> mem "auditor_name" Jsont.string ~enc:auditor_name
|
|
|
|
|
|> mem "auditor_pub" EddsaPublicKey.jsont ~enc:auditor_pub
|
|
|
|
|
|> mem "master_sig" MasterAddAuditorPS.jsont ~enc:master_sig
|
|
|
|
|
|> mem "validity_start" Timestamp.jsont ~enc:validity_start
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 16:22:38 +01:00
|
|
|
|
|
|
|
|
module AuditorTeardownMessage = struct
|
|
|
|
|
type t = {
|
|
|
|
|
master_sig: MasterDelAuditorPS.t;
|
|
|
|
|
(* TODO time
|
|
|
|
|
something about using monotonic system time here! *)
|
|
|
|
|
validity_end: Timestamp.t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make master_sig validity_end = { master_sig; validity_end } in
|
|
|
|
|
let master_sig v = v.master_sig in
|
|
|
|
|
let validity_end v = v.validity_end in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"AuditorTeardownMessage" make
|
|
|
|
|
|> mem "master_sig" MasterDelAuditorPS.jsont ~enc:master_sig
|
|
|
|
|
|> mem "validity_end" Timestamp.jsont ~enc:validity_end
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 16:30:42 +01:00
|
|
|
|
|
|
|
|
module WireFeeSetupMessage = struct
|
|
|
|
|
type t = {
|
|
|
|
|
wire_method: string;
|
|
|
|
|
(* TODO over which struct?
|
|
|
|
|
Signature using the exchange's offline key
|
|
|
|
|
with purpose TALER_SIGNATURE_MASTER_WIRE_FEES *)
|
|
|
|
|
master_sig_wire: EddsaSignature.t;
|
|
|
|
|
fee_start: Amount.t;
|
|
|
|
|
fee_end: Amount.t;
|
|
|
|
|
closing_fee: Amount.t;
|
|
|
|
|
wire_fee: Amount.t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make wire_method master_sig_wire fee_start fee_end closing_fee wire_fee
|
|
|
|
|
=
|
|
|
|
|
{
|
|
|
|
|
wire_method;
|
|
|
|
|
master_sig_wire;
|
|
|
|
|
fee_start;
|
|
|
|
|
fee_end;
|
|
|
|
|
closing_fee;
|
|
|
|
|
wire_fee;
|
|
|
|
|
}
|
|
|
|
|
in
|
|
|
|
|
let wire_method v = v.wire_method in
|
|
|
|
|
let master_sig_wire v = v.master_sig_wire in
|
|
|
|
|
let fee_start v = v.fee_start in
|
|
|
|
|
let fee_end v = v.fee_end in
|
|
|
|
|
let closing_fee v = v.closing_fee in
|
|
|
|
|
let wire_fee v = v.wire_fee in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"WireFeeSetupMessage" make
|
|
|
|
|
|> mem "wire_method" Jsont.string ~enc:wire_method
|
|
|
|
|
|> mem "master_sig_wire" EddsaSignature.jsont ~enc:master_sig_wire
|
|
|
|
|
|> mem "fee_start" Amount.jsont ~enc:fee_start
|
|
|
|
|
|> mem "fee_end" Amount.jsont ~enc:fee_end
|
|
|
|
|
|> mem "closing_fee" Amount.jsont ~enc:closing_fee
|
|
|
|
|
|> mem "wire_fee" Amount.jsont ~enc:wire_fee
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 16:45:03 +01:00
|
|
|
|
|
|
|
|
module GlobalFees = struct
|
|
|
|
|
type t = {
|
|
|
|
|
start_date: Timestamp.t;
|
|
|
|
|
end_date: Timestamp.t;
|
|
|
|
|
history_fee: Amount.t;
|
|
|
|
|
account_fee: Amount.t;
|
|
|
|
|
purse_fee: Amount.t;
|
|
|
|
|
history_expiration: RelativeTime.t;
|
|
|
|
|
purse_account_limit: int;
|
|
|
|
|
purse_timeout: RelativeTime.t;
|
|
|
|
|
(* Signature of TALER_GlobalFeesPS. *)
|
|
|
|
|
master_sig: GlobalFeesPS.t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make start_date end_date history_fee account_fee purse_fee
|
|
|
|
|
history_expiration purse_account_limit purse_timeout master_sig =
|
|
|
|
|
{
|
|
|
|
|
start_date;
|
|
|
|
|
end_date;
|
|
|
|
|
history_fee;
|
|
|
|
|
account_fee;
|
|
|
|
|
purse_fee;
|
|
|
|
|
history_expiration;
|
|
|
|
|
purse_account_limit;
|
|
|
|
|
purse_timeout;
|
|
|
|
|
master_sig;
|
|
|
|
|
}
|
|
|
|
|
in
|
|
|
|
|
let start_date v = v.start_date in
|
|
|
|
|
let end_date v = v.end_date in
|
|
|
|
|
let history_fee v = v.history_fee in
|
|
|
|
|
let account_fee v = v.account_fee in
|
|
|
|
|
let purse_fee v = v.purse_fee in
|
|
|
|
|
let history_expiration v = v.history_expiration in
|
|
|
|
|
let purse_account_limit v = v.purse_account_limit in
|
|
|
|
|
let purse_timeout v = v.purse_timeout in
|
|
|
|
|
let master_sig v = v.master_sig in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"GlobalFees" make
|
|
|
|
|
|> mem "start_date" Timestamp.jsont ~enc:start_date
|
|
|
|
|
|> mem "end_date" Timestamp.jsont ~enc:end_date
|
|
|
|
|
|> mem "history_fee" Amount.jsont ~enc:history_fee
|
|
|
|
|
|> mem "account_fee" Amount.jsont ~enc:account_fee
|
|
|
|
|
|> mem "purse_fee" Amount.jsont ~enc:purse_fee
|
|
|
|
|
|> mem "history_expiration" RelativeTime.jsont ~enc:history_expiration
|
|
|
|
|
|> mem "purse_account_limit" Jsont.int ~enc:purse_account_limit
|
|
|
|
|
|> mem "purse_timeout" RelativeTime.jsont ~enc:purse_timeout
|
|
|
|
|
|> mem "master_sig" GlobalFeesPS.jsont ~enc:master_sig
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 16:53:53 +01:00
|
|
|
|
|
|
|
|
module WireSetupMessage = struct
|
|
|
|
|
type t = {
|
|
|
|
|
payto_uri: string;
|
|
|
|
|
master_sig_wire: MasterWireDetailsPS.t;
|
|
|
|
|
master_sig_add: MasterAddWirePS.t;
|
|
|
|
|
(* TODO time monotonic *)
|
|
|
|
|
validity_start: Timestamp.t;
|
|
|
|
|
bank_label: string option;
|
|
|
|
|
priority: int option;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make payto_uri master_sig_wire master_sig_add validity_start bank_label
|
|
|
|
|
priority =
|
|
|
|
|
{
|
|
|
|
|
payto_uri;
|
|
|
|
|
master_sig_wire;
|
|
|
|
|
master_sig_add;
|
|
|
|
|
validity_start;
|
|
|
|
|
bank_label;
|
|
|
|
|
priority;
|
|
|
|
|
}
|
|
|
|
|
in
|
|
|
|
|
let payto_uri v = v.payto_uri in
|
|
|
|
|
let master_sig_wire v = v.master_sig_wire in
|
|
|
|
|
let master_sig_add v = v.master_sig_add in
|
|
|
|
|
let validity_start v = v.validity_start in
|
|
|
|
|
let bank_label v = v.bank_label in
|
|
|
|
|
let priority v = v.priority in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"WireSetupMessage" make
|
|
|
|
|
|> mem "payto_uri" Jsont.string ~enc:payto_uri
|
|
|
|
|
|> mem "master_sig_wire" MasterWireDetailsPS.jsont ~enc:master_sig_wire
|
|
|
|
|
|> mem "master_sig_add" MasterAddWirePS.jsont ~enc:master_sig_add
|
|
|
|
|
|> mem "validity_start" Timestamp.jsont ~enc:validity_start
|
|
|
|
|
|> mem "bank_label" (Jsont.option Jsont.string) ~enc:bank_label
|
|
|
|
|
|> mem "priority" (Jsont.option Jsont.int) ~enc:priority
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 17:10:13 +01:00
|
|
|
|
|
|
|
|
module WireTeardownMessage = struct
|
|
|
|
|
type t = {
|
|
|
|
|
payto_uri: string;
|
|
|
|
|
master_sig_del: MasterDelWirePS.t;
|
|
|
|
|
(* TODO time monotonic *)
|
|
|
|
|
validity_end: Timestamp.t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make payto_uri master_sig_del validity_end =
|
|
|
|
|
{ payto_uri; master_sig_del; validity_end }
|
|
|
|
|
in
|
|
|
|
|
let payto_uri v = v.payto_uri in
|
|
|
|
|
let master_sig_del v = v.master_sig_del in
|
|
|
|
|
let validity_end v = v.validity_end in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"WireTeardownMessage" make
|
|
|
|
|
|> mem "payto_uri" Jsont.string ~enc:payto_uri
|
|
|
|
|
|> mem "master_sig_del" MasterDelWirePS.jsont ~enc:master_sig_del
|
|
|
|
|
|> mem "validity_end" Timestamp.jsont ~enc:validity_end
|
|
|
|
|
|> finish
|
|
|
|
|
end
|
2025-12-04 17:16:41 +01:00
|
|
|
|
|
|
|
|
module DrainProfitsMessage = struct
|
|
|
|
|
type t = {
|
|
|
|
|
debit_account_section: string;
|
|
|
|
|
credit_payto_uri: string;
|
|
|
|
|
wtid: B32.t;
|
|
|
|
|
(*
|
|
|
|
|
// TALER_MasterDrainProfitPS.
|
|
|
|
|
// Must have purpose TALER_SIGNATURE_MASTER_DRAIN_PROFITS.
|
|
|
|
|
*)
|
|
|
|
|
master_sig: EddsaSignature.t;
|
|
|
|
|
date: Timestamp.t;
|
|
|
|
|
amount: Amount.t;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let jsont =
|
|
|
|
|
let make debit_account_section credit_payto_uri wtid master_sig date amount
|
|
|
|
|
=
|
|
|
|
|
{
|
|
|
|
|
debit_account_section;
|
|
|
|
|
credit_payto_uri;
|
|
|
|
|
wtid;
|
|
|
|
|
master_sig;
|
|
|
|
|
date;
|
|
|
|
|
amount;
|
|
|
|
|
}
|
|
|
|
|
in
|
|
|
|
|
let debit_account_section v = v.debit_account_section in
|
|
|
|
|
let credit_payto_uri v = v.credit_payto_uri in
|
|
|
|
|
let wtid v = v.wtid in
|
|
|
|
|
let master_sig v = v.master_sig in
|
|
|
|
|
let date v = v.date in
|
|
|
|
|
let amount v = v.amount in
|
|
|
|
|
let open Jsont.Object in
|
|
|
|
|
map ~kind:"DrainProfitsMessage" make
|
|
|
|
|
|> mem "debit_account_section" Jsont.string ~enc:debit_account_section
|
|
|
|
|
|> mem "credit_payto_uri" Jsont.string ~enc:credit_payto_uri
|
|
|
|
|
|> mem "wtid" B32.jsont ~enc:wtid
|
|
|
|
|
|> mem "master_sig" EddsaSignature.jsont ~enc:master_sig
|
|
|
|
|
|> mem "date" Timestamp.jsont ~enc:date
|
|
|
|
|
|> mem "amount" Amount.jsont ~enc:amount
|
|
|
|
|
|> finish
|
|
|
|
|
end
|