commit 60c24937724c0e1052578627bf80dc74b8b44121
parent 6abdd47e4288407560eb1a3f17a70487315ef09b
Author: Mikolai Gütschow <mikolai.guetschow@tu-dresden.de>
Date: Fri, 8 May 2026 13:43:10 +0200
protocol/payment: rename timestamps
Diffstat:
3 files changed, 799 insertions(+), 791 deletions(-)
diff --git a/draft-guetschow-taler-protocol.md b/draft-guetschow-taler-protocol.md
@@ -757,8 +757,8 @@ Knows ⟨coinᵢ⟩ Knows merchant.priv Knows exchange.
| | | (E1) deposit check |
| | +--------------------+
| | |
- | |<- (timestamp, exchange.pub, -|
- | | sig) |
+ | |<------ (time_deposit, -------|
+ | | exchange.pub, sig) |
| | |
| +---------------------------+ |
| | (M4) deposit verification | |
@@ -799,7 +799,8 @@ or proving the payment without resorting to the individual coins.
Check order.token? == token?
h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
-determine timestamp, refund_deadline, wire_deadline
+timestamp = now()
+determine refund_deadline, wire_deadline from timestamp
contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_deadline, wire_deadline)
contract.nonce = nonce.pub
Persist contract
@@ -823,7 +824,7 @@ for i in 0..n:
msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
( h_contract | uint256(0x0)
| uint512(0x0) | contract.h_wire | coinᵢ.h_denom
- | contract.timestamp | contract.refund_deadline
+ | timestamp | contract.refund_deadline
| contributionᵢ + denomᵢ.fee_deposit
| denomᵢ.fee_deposit | merchant.pub | uint512(0x0) ))
sigᵢ = Ed25519-Sign(coinᵢ.priv, msgᵢ)
@@ -844,6 +845,9 @@ msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
sig = Ed25519-Sign(merchant.priv, msg)
~~~
+TODO: what about wire_fees, those should be checked for as well, or do we just assume merchant will pay those?
+see src/backend/taler-merchant-httpd_post-orders-ORDER_ID-pay.c:2760
+
~~~
(E1) deposit check (exchange)
@@ -864,10 +868,10 @@ for i in 0..n:
Check-Subtract(coinᵢ.value, total)
Persist deposit-record
schedule bank transfer to payto
-timestamp = now()
+time_deposit = now()
msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
- | timestamp | info.time.wire_deadline
+ | time_deposit | info.time.wire_deadline
| info.time.refund_deadline
| Sum ⟨depositᵢ.contribution⟩
| SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub ))
@@ -880,7 +884,7 @@ sig = Ed25519-Sign(exchange.priv, msg)
h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
- | timestamp | contract.wire_deadline
+ | time_deposit | contract.wire_deadline
| contract.refund_deadline
| Sum ⟨depositᵢ.contribution⟩
| SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub ))
@@ -1398,7 +1402,7 @@ They are generated by going through the protocol operations in the following ord
1. Withdraw two coins `coin₀` and `coin₁` from a single `reserve` (cf. {{withdraw}}).
2. Pay for one `order` with the full value of `coin₀` and a partial value of `coin₁` (cf. {{payment}}).
-3. Obtain a partial refund for `coin₀` used to pay for the `order` (cf. {{refund}}).
+3. Obtain a partial refund on `coin₀` used to pay for the `order` (cf. {{refund}}).
4. Refresh the now-dirty `coin₁` to two new coins `coin₂` and `coin₃` (cf. {{refresh}}).
5. Regenerate `coin₂` and `coin₃` with the knowledge of `coin₁` (cf. {{link}}).
6. Create an `account` for w2w transfers (cf. {{w2w-account}}).
@@ -1407,7 +1411,7 @@ They are generated by going through the protocol operations in the following ord
9. Recoup the value of `coin₅` obtained via withdrawal from `account` (cf. {{withdraw-recoup}}).
10. Recoup the value of `coin₃` obtained via refresh from `coin₁` (cf. {{refresh-recoup}}).
-// todo: sending full coins only works without fees, should we set fees to zero?
+// todo: p2p sending full coins only works without fees, should we set fees to zero?
The test vectors in this document have been generated by the GNU Taler reference implementation written in C.
All binary data is provided in hexadecimal notation.
@@ -1415,290 +1419,7 @@ Big numbers for RSA are represented in big-endian byte order (most significant b
## Test Case 1
-~~~
-exchange.master_pub = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8b0217f38b095
- b4313b
-exchange.priv = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c750eabfa0f7ac70a2442
-exchange.pub = 4c130aae3246831808a162e2d4330de394e5f0d7dff75a80f3fa045b1a43eabb
-exchange.url = https://exchange.taler.example.org/
-denom₀.pub.n = ba42b9e75e48847bab175ed4797384d68a430fd849a914aa68438349743b2728
- d9ca97709c15d5c81c7d9d11c84ec9c60cec03aed4b36ad153768eb30cf98454
- 74e97ee9d7475ebc926d87135d56926b7df1cea3ec38897a74bc3e245e59ffa7
- 6e5aff2c2f2eb84e7133a879f4229221f91c7bddf96088e4020e16444d94acc3
- 0708069f4a1bde3dcbead32e3916a9f6722adb3d63bb9075dde49258fbd28a9a
- 09251fa08b64faee53a506b9f637136c72af7382b9243fa8996ad4d72cc1b05c
- fb45271cb3187b4eeec0b5f9e847cdcc0c3ddef9787164a1aee7e4e1ee6de1b9
- 5282c1ff646aa70aabd1df0003f75d3585e9e740916cee4f7bca0cd82f72104d
-denom₀.pub.e = 010001
-denom₀.priv.d = 07bc432fbc6eeb0f9ec2a4f5d2886d65228f57ee5ddac788af355493bd9fc247
- d449b161e41d95080f44d93bd6938d162c4db5f6720f7479768ba73000f330df
- 780e856e8d3a01d1778c546e85b3157820de24bc9290238782271a3694f38c66
- 45f3420331ff70f8930377f4fea25beaccc775ce796f9ca7c97d0fc82ce7a688
- 0dd437e6b30695ca51a58f0239aef7481932550ce61b5b085313cb888c893cc1
- bbef6b47c607e1189f8cccb04eeb9f87b9e53f414850f8b923ce83e2859c0434
- a3d14d861e864fd5ce701af11611398a73515b7056b2828e564cdec6052bdbb4
- 3ff435178577198de0676e5d378ade9b31844e81e2218ba3b3aec5bff9a26621
-denom₀.hash = 8653090e3f3f5efac9770a5dd0c97813940c191c9fa1713367f8bb1279b1e3d2
- 7f32d16ea7699501e5fc4d176725d76ab0307f9bdf9d0d263c2256a7f1c63143
-denom₀.value = KUDOS:5.12
-denom₀.fee_withdraw = KUDOS:0.01
-denom₀.fee_deposit = KUDOS:0.01
-denom₀.fee_refresh = KUDOS:0.01
-denom₀.fee_refund = KUDOS:0.01
-denom₁.pub.n = d5455fb79449df7bf548e384d5201d75f4f7697ef9b8051eb8536f66783e70ca
- 2d524fefa6840c1f87d9d881486815d5ace866a32269b05bdba7ff6024811c19
- 456026b0a59da4db96f58729d286c90be8cd9cbf575d346202b43282d601b575
- 1ff77a88a0742a692349a0e3fa8ed5518fc5378fcf434929b541c942573abef3
- 10b87776e976e81cf650a04399fabddbde677163918250c4d45f5e90ee7539de
- 500a8e915be1d5f17d79cb9585ccdf5dba42ef53c24eae7d7c93c4e0a4327882
- 45b7c76a587f0ac6889d30389531362d51c2ad65cb1e28b4ad4cc97fcd2a4aed
- d6612ae8888eb2dbc4de0cf30f46a43b76cc8c3245eefe013195a237f02d13b5
-denom₁.pub.e = 010001
-denom₁.priv.d = 5a520e0e663bbeecf55d5015d258ce8145247ec62aa5d76d422cfbb1cedccad1
- a4ce06527d17d1368d47221ce678463eff02516d6746914ce5c2c9318364366d
- 31675e1b539866d8249f89059a4640e0cd503ec0fe13d7fa6620c07f8e789ccb
- a4a51f7cbb4f5722bdb211f45b09a0a7f11659c88ac37939b3accfba4bccf24e
- a260e21aaec0dfbf857178438986e963e9e356277c3badc34fc91b705d9956b4
- bedc0947d65924d7dd31e564de798eb06837380caed6813d3761d119901c5540
- eb74c3cb674fdfd64b67d78ebd40de0cafd53c038a0a8e87890b953b8b94a977
- 1a6efb3142ca02db873053f8d1de2082db4366fc072aafc723c036a2fb999605
-denom₁.hash = 1de6052bce12feaa2d26e3bba1789b0c2295028279f3eaff8e1345448ba05390
- cff49656ed72a1f7ef6ee2c4a80f80eefa0d0f906e74305b0215c4194ab1c7b8
-denom₁.value = KUDOS:2.56
-denom₁.fee_withdraw = KUDOS:0.01
-denom₁.fee_deposit = KUDOS:0.01
-denom₁.fee_refresh = KUDOS:0.01
-denom₁.fee_refund = KUDOS:0.01
-denom₂.pub.n = d1320993658042f995f09ed66ad2283e457a1f44cad96f1cf5a6299ac93d6172
- 4a7448d70e56a38666ec66352a5810ca3e544d957dedb5789e135589fcb8b139
- c65a2f70d7c421dfd4e27cf38d463074d286730be23d446fc07811519b068346
- b28b86b94acff35524eb62436852714c92f03b0bac21bb6bf727734be7871b70
- 2f928c3ced4bad9ba2d49cec6a86d1019181c65c16abf7b391f103c90c3eaaaa
- 9d5298a4a60c71bdaf0f08246327a62399bf4c424c1ed7718cb5df178daa9710
- ec9d098e99ed0456de2fbaf7865ba47931c52d1cac78cacc1bc451782587487a
- 6189addfe5dcdf6f190f28816707e3d1e104b5a1f7a570b75c1951588f3289ef
-denom₂.pub.e = 010001
-denom₂.priv.d = 311849a8066faa083218b4e6444e8af44650e94ab7427d31b232eb5bb0b3cf8d
- 478cefd54cbfa783f0deb503f02a97d226fb98f3a708a508a82c886c285bddf7
- dda5a7b19769a7bb84961cd5f9c749b2f8ff65bb99be6033cbdb41d1418d2f3c
- e5c519fa9d649d4a53ae4c32dea64e81b6905b831b44155cbab5cef8b6defde0
- 9295662cdf2189f2763ede05bea0acb707b9b6b087dcebb9ca81f1c2785d6560
- f93bf1a1860676cccceb079c22b48b9fdef68e1d286164f132ffddeab29fa7a7
- 04e1bc3f9f5e28c39675f17136aed8542aa4470a14a7380a4016b21d43ef5b9e
- 2b241ced017c54247c12fd6beccb7bd356820b0246553c751b3e071468c2efdd
-denom₂.hash = 4f8c487d21ffb5bb7571f5d66bcf6f93f4f5c043df5483669383128700064e86
- 37afecd6029cb36dfc5a60d20ff3112ff1b5ad1b53c78cf39ad13cd2531ba24e
-denom₂.value = KUDOS:0.16
-denom₂.fee_withdraw = KUDOS:0.01
-denom₂.fee_deposit = KUDOS:0.01
-denom₂.fee_refresh = KUDOS:0.01
-denom₂.fee_refund = KUDOS:0.01
-denom₃.pub.n = bddb1806b7b7663d94bedbeccbb515987fcae457b5920d85b8485edac6ab0e73
- e6991780e9f1fa6f88e500e0ccd9eeb80d8e3b66289a7cf1b25bd56d05081d58
- 3864ad225a36f8d38391782a85bfe320d439443e8ea19f555edb36fcb58af81c
- a5168ca7c42dda68f191bd1587b4da27703384f2aad300a043549c67fc6defd9
- 8bd1074b3bab1bc0d89b87d81f8a1f555a3b4ce2b4ca7b0b1d8f446fa93258db
- 511cc3bc2ff62871cb4c746f6806d0b839db8cc560da06eb5619d9d42309a771
- 61373708db18e453ff0a1d6f63281c54ffacada7c8bf5ca7281ffe7e2e5be03f
- c006c064d820f719e672429628837399a565dd9d70f6e9ed91e1eb0567978015
-denom₃.pub.e = 010001
-denom₃.priv.d = 1e3370867d0a0d1705b18e0d848d73f7d422f920e4aec23cea7184b9463a26c1
- e9704d4cacaa5952b8683eb403e78a5c628cfa1b9da0e44d9462f1b7f66c1c88
- 3b419f484ed3de257e113c1828e4e5e3592f1a3bddf78d7f88927ee99892c336
- 2ca2c226dbd90971d68a54404d069d5f5704b304e131fb3058959338781a2039
- 93804f64def2980210dc3f4e77c1207400e922032952cb154bb1b776d164cce6
- 9e418844f2f4b20850c0a23d30059362edadfe00fbfa04b6833fc4606deda441
- eb345c49b52d91063da7c55ecea7b32e99a49a823264955803ce3ee220a2cc64
- cd4321e18ae28bb1071c7746e8a3d69adef5113e21a01cab6809668793c2a94f
-denom₃.hash = 96524d30b4398d0d5bbe2eff902c4df1cc8286629d149bee0530edcfb361c468
- ea5fdb1b41d538223c8b3fe1a974951bb3290bbfffc6f10cbf0326585041ca4d
-denom₃.value = KUDOS:0.08
-denom₃.fee_withdraw = KUDOS:0.01
-denom₃.fee_deposit = KUDOS:0.01
-denom₃.fee_refresh = KUDOS:0.01
-denom₃.fee_refund = KUDOS:0.01
-merchant.priv = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670ae2e5147ce848767037
-merchant.pub = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0c5e880e3e0d0ab19f0
-merchant.url = https://merchant.taler.example.org/
-merchant.payto = payto://x-taler-bank/bank.taler.example.org/merchant
-~~~
-
-
-### Withdrawal {#tc1-withdraw}
-
-~~~
-(W1) reserve key generation (wallet)
-
-reserve.priv = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56d128b1432e55a6c6ba
-reserve.pub = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06e73f4287148cb93c38
-~~~
-~~~
-(W2) coin generation and blinding (wallet)
-
-batch_seed = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041494f8bf1f8cd30f113
-coin_seed₀ = 88899daa409b8c4c4a91c8e39030d247d00b292eff952e36067fbe33f2d7ce48
-coin_seed₁ = f5be0b8790719072c7043c257f2c114cd8cb45ea5d98c4aa25d9025f45f1caeb
-blind_secret₀ = a3cbe2b0babf5bdfb98f45804acf63225c16e09be1677f705393df3f5de98ebf
-blind_secret₁ = 8ea6335ed3ff8a41f9fae95e9fd87382be402d6c26ef972381dee6b3c1e9d775
-coin₀.priv = a5a38bb23a9f36564f9d4e566cdd7e3521b04f8ea4175da726ac4e3ac540b485
-coin₁.priv = ae98c5207fe31e20a7b7a8677b780c6735ce69df32d3085d504010f23c59064a
-coin₀.pub = afbdf99f1a794add25bad59c9a3f442714e166adc99c57db991947669a36b185
-coin₁.pub = aa7118596b1adf89543e9afcf2925e516a782eed9d75c8abc4a470e7efdd7fe4
-planchet₀ = 64ede0cf40a952b95af4b09b22c6fd27a1ff6d0ae3920ea03fe14a8b547f1e14
- a2eea98443e7aa092075f6585103fb06c1d68fb4616bf33ae30a207e51840f1a
- e655a734184a73d804df42650ce296954c9b61e249486468f7fda8a74f85ec6c
- cdb34a66819fbeaf846b10087ffaf8e734428a907b96c6a112f8f943b3a8d554
- 55c01b0daf55456acf0715874ff90fba45b265e2021a70997100fb18bfbef822
- c8475820b4855f141730751bcfad2e7eb46dd6c6a400a8a6a98486c4a2bce4d3
- 407a0d0ba612faebb49428ba3a1986eddadb04b6790fbb7bd27cc0bd98341c60
- ec5b980275202aedd4b0cf3b7ee1732c67c84db4b30b60b551cbf849222c60e1
-planchet₁ = 41f8a6622c99b6a9c30d52d19fc2c20a39a481219de4b0f3e7f604efed5d9625
- 54ea13255785d10a037e14abd75d80a0aa9861df9d80a051c418ff197e68bd0e
- ee61e6fd5d3214633734659e8bbd7dd2fe566bd41c537a5759bad9bbca6b2eb7
- e3217e7d3cbefff192d83bd0527dbe0eff56df0b2e2062670d2873ca7766a7c1
- 255e6fcf2c37e95de19fcad244f3986bab45c0a3aca726fc682455ea1166a238
- 9152d7a67d181f035de6bdb97633888f0594c2f63dd3965134372507faf84f75
- 3759abd662d4c7e8df7e01149ff44da3499ed49406d9398e86c4abf12a1f57f3
- 8002115ef7283e4d5422b41c752a0cce8c2c1a9b84e109b4554fc1150ef578b9
-h_planchet₀ = 888da42dbf4897a5d6d9420b827e340c74c0b0e973e140ad1c7b9abfc400a9ec
- 5a86b3185e4c656dbe8e01125604616de83fa28910fae513d016f56c3ca94eb4
-h_planchet₁ = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd3328fcfce41fbe9310d6
- aa96d91fdd77599c122cc5390ad7cb86d2c6d4261bd5950e7ec0f86959613841
-sig = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f1cc2e96e9ab3392894
- c65ab6a0af31ccdb395db5c526770077642502e27d4619d385a91dd13854e706
-~~~
-~~~
-(E1) coin issuance and signing (exchange)
-
-total = KUDOS:7.7
-blind_sig₀ = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a192f56fde38ac9feec7
- 841be59b2aa993084c50f70dfd9673dc723eec9d84c28ebd5f8104d1b0b29cf1
- 18cd64cbe33925524a3363a1a6f24f59d47a404cf74680eee97cdeb8cc44a0b8
- 4f3db4496d9bed1224c0fbda64d40f84ef5447d764fb714ca8e72a23a882e749
- e47a519310f6d87b3e8ddc3e4ac4e541cdbfe7550c92f41c511b544d9fbdc2a7
- 296b958e9df0b1394210aef4f1a780a129883d4bcb45425eef96204a7eaa9daa
- 7d21827ecbf4571cefe6dbe65314e61c688175c1e81e01d4f0377c9c2312b6cc
- 3487f2dd2cf8d85efde346f4d1a12de70bec4038b0bea0c505087c0e67ce4694
-blind_sig₁ = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec81649256215f13a8965ad37d8
- d47c264668ec187e46d75210ce601362fbb15f61a24ec1d337dd2589b5a4ee0e
- 77a8d9734aca6a149b9f9b3a78c158b1f8cb243b8cbe9c2212290e8bc731d023
- 82463f3e1cf0fc86c5472b8c96c5eaeac9c9064fdf7411f97935f27fd0bf8820
- 0440c7cc3e6960c5c5156aedb5a820077be08f1ac4b00780258d7b843b21d7ba
- f2d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3dfe7ff20ec85fa4d
- 5e5aec24d89848645ffadb0de3da80c6e41b96571ef28e3d132b7c3fd16a289e
- 32389cffb653b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f5034c8
-~~~
-~~~
-(W3) coin unblinding (wallet)
-
-coin₀.sig = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659de7512b599e7e6524ad
- 5a283c81d289d3ec75fc81e7f336bd41dd67a41b72a98d9171f0461c188535b5
- 55019079a18b4491903797f62a034e5f277ce8f7f3f56fbe47e44113561fd414
- c841c2da97da1ae92df0e2cfbe3c26ad37f8bab9bd71365ac536204cda7c21dc
- 39891b5cbb4e213f75d4e09c248a7a59f6322fd011619b29ec25ad621dfa2d6f
- ae9f8b91935caf54d0d30f4a03bf6beed6637a4054efbad7a41f9da434f07cfd
- 2f7619e8a3c82b30e079ff9fe13fc023fba7d627f4fb21e14467ce1db2776783
- 1eb1c3ad5c39f61437a0a70c300fd84cd9280474bb507768a868ea92fa905428
-coin₁.sig = 355aa5b6bf10591375f22a014640cd242f470834759fab4421b4d237a149bc3e
- 5fbc8f073e1348da770983cd36df9cf72a30bfe55776744b2d787acb06ba25cc
- def36e5269771fe4a38a1109e8b96437a3cc625003f7fdf4d0cc879335584c5b
- 13f2b29be1ea4d8a2da7826d608179d98b5edb11261e2048fbbba217a52ae862
- d1e78e30c0787ee40908f1bca708c434d5412a262eca6bcd0ac5890bfbbe7df6
- d69a5544d0054716dfda47791546c177223606c0645858a15b36887619a9d70a
- 515f42897758bbe181765d7184cc92b5e2d743df1db9b30394b697117ad24811
- 812febe0a3c57cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f516469
-~~~
-
-### Payment and Deposit {#tc1-payment}
-
-~~~
-(M1) order generation (merchant)
-
-wire_salt = 4c5249caea865380e0e519fc38177686
-order.id = ORDER-40
-order.price = KUDOS:7.42
-~~~
-~~~
-(W1) nonce generation (wallet)
-
-nonce.pub = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7da63194e9ef40fcbd0d
-~~~
-~~~
-(M2) contract generation (merchant)
-
-h_wire = ec4e7258747a4de49628a27907b74f0aad097cfafaa595320f81786375430b67
- ae1ada754299bbc0472f5a1e8bae6fe8e5dc52683dd09490ff06fb2fa4f20ec2
-merchant_time = Sat Feb 14 13:37:42 2026
-pay_deadline = Sat Feb 14 14:07:42 2026
-refund_deadline = Sun Feb 15 13:37:42 2026
-wire_deadline = Mon Feb 16 13:37:42 2026
-contract = {
- "version": 0,
- "summary": "Free Software Support",
- "order_id": "ORDER-40",
- "products": [],
- "timestamp": {
- "t_s": 1771076262
- },
- "refund_deadline": {
- "t_s": 1771162662
- },
- "pay_deadline": {
- "t_s": 1771078062
- },
- "wire_transfer_deadline": {
- "t_s": 1771249062
- },
- "merchant_pub": "YN6P8SGSE8ZQZ8PEF4K7JMZXV1JMSZ6GYB7W1HF8G3HY1M5B37R0",
- "merchant_base_url": "https://merchant.taler.example.org/",
- "merchant": {
- "name": "Taler Merchant"
- },
- "h_wire": "XH774P3MF96Y95H8M9WGFDTF1APGJZ7TZAJSACGFG5W66XA31DKTW6PTEN19KEY08WQNM7MBNSQYHSEWA9M3VM4MJ3ZGDYSFMKS0XGG",
- "wire_method": "XXXX",
- "exchanges": [
- {
- "url": "https://exchange.taler.example.org/",
- "priority": 1024,
- "master_pub": "7JTYK0HXPASKBZDKYA2AX5GEATZ8P20WD0CVHC11FWWB15DM64XG"
- }
- ],
- "nonce": "CWMXD6NXFP11HR1CJMSHFD3BQ8JJ5VY2R6D7V9HHJKMYYG7WQM6G",
- "amount": "KUDOS:7.42",
- "max_fee": "KUDOS:0.01"
-}
-h_contract = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2839a9a539d845a5da4
- 622498e3819cb49206810688a93de1989c6542d2cf1d71f64dc998193e76d535
-sig = c249ee766b4dd256560d48b367d05a41cf7169306247ec56c51c39412b34c110
- 15e365c2b2836761ba020b7175e60870572a6c7f780eeabb6f0777783064d602
-~~~
-~~~
-(W2) payment preparation (wallet)
-
-contribution₀ = KUDOS:5.12
-contribution₁ = KUDOS:2.3
-sig₀ = 1799394abc575b6b69a071949742fed8cd076c70403dbcfa0ae3baaf0afc0983
- 7b1b301b95cf37c1407566b75c9ae1f79ec7a7d67fbea81315e4f30b83067a0c
-sig₁ = c4569c0ab233aa265809dc9481740663a5310c5887f96f28872fcca81851e66a
- ca66c65696e226aaf18752a02319278a7bd18f3fb203477a88d28b8e5061bf03
-~~~
-~~~
-(M3) deposit preparation (merchant)
-
-~~~
-~~~
-(E1) deposit check (exchange)
-
-exchange_time = Sat Feb 14 13:45:44 2026
-sig = d5012923d92fdd984109eadd60234953d6bb5b1bd3695a402ad32a155e3f3661
- ffe6dde8bbb0d7ee58342b8a0a3296e5eaa8e34655360e6138b7d7fda4eeec09
-~~~
-~~~
-(M2) deposit verification (merchant)
-
-sig = e66d503c843d72da4b6eb95f872396449de25cbf80b9c243d8c9ed2bde533d24
- 60542c685bfdbf2eabc755510a60b97ed289711fd3f353cd80aa791e2e2f1e0d
-~~~
+{::include ./test-vectors/test-case-1.md}
### Refund {#tc1-refund}
diff --git a/draft-guetschow-taler-protocol.xml b/draft-guetschow-taler-protocol.xml
@@ -24,7 +24,7 @@
<email>mikolai.guetschow@tu-dresden.de</email>
</address>
</author>
- <date year="2026" month="May" day="07"/>
+ <date year="2026" month="May" day="08"/>
<workgroup>independent</workgroup>
<keyword>taler</keyword>
<keyword>cryptography</keyword>
@@ -719,8 +719,8 @@ Knows ⟨coinᵢ⟩ Knows merchant.priv Knows exchange.
| | | (E1) deposit check |
| | +--------------------+
| | |
- | |<- (timestamp, exchange.pub, -|
- | | sig) |
+ | |<------ (time_deposit, -------|
+ | | exchange.pub, sig) |
| | |
| +---------------------------+ |
| | (M4) deposit verification | |
@@ -756,7 +756,8 @@ or proving the payment without resorting to the individual coins.</t>
Check order.token? == token?
h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
-determine timestamp, refund_deadline, wire_deadline
+timestamp = now()
+determine refund_deadline, wire_deadline from timestamp
contract = (order.{id,price,info,token?}, exchange, h_wire, timestamp, refund_deadline, wire_deadline)
contract.nonce = nonce.pub
Persist contract
@@ -779,7 +780,7 @@ for i in 0..n:
msgᵢ = Gen-Msg(WALLET_COIN_DEPOSIT,
( h_contract | uint256(0x0)
| uint512(0x0) | contract.h_wire | coinᵢ.h_denom
- | contract.timestamp | contract.refund_deadline
+ | timestamp | contract.refund_deadline
| contributionᵢ + denomᵢ.fee_deposit
| denomᵢ.fee_deposit | merchant.pub | uint512(0x0) ))
sigᵢ = Ed25519-Sign(coinᵢ.priv, msgᵢ)
@@ -797,6 +798,8 @@ h_contract = SHA-512(canonicalJSON(contract))
msg = Gen-Msg(MERCHANT_CONTRACT, h_contract)
sig = Ed25519-Sign(merchant.priv, msg)
]]></artwork>
+ <t>TODO: what about wire_fees, those should be checked for as well, or do we just assume merchant will pay those?
+see src/backend/taler-merchant-httpd_post-orders-ORDER_ID-pay.c:2760</t>
<artwork><![CDATA[
(E1) deposit check (exchange)
@@ -817,10 +820,10 @@ for i in 0..n:
Check-Subtract(coinᵢ.value, total)
Persist deposit-record
schedule bank transfer to payto
-timestamp = now()
+time_deposit = now()
msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
- | timestamp | info.time.wire_deadline
+ | time_deposit | info.time.wire_deadline
| info.time.refund_deadline
| Sum ⟨depositᵢ.contribution⟩
| SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub ))
@@ -832,7 +835,7 @@ sig = Ed25519-Sign(exchange.priv, msg)
h_wire = HKDF(wire_salt, payto, "merchant-wire-signature", 64)
msg = Gen-Msg(EXCHANGE_CONFIRM_DEPOSIT,
( h_contract | h_wire | uint512(0x0)
- | timestamp | contract.wire_deadline
+ | time_deposit | contract.wire_deadline
| contract.refund_deadline
| Sum ⟨depositᵢ.contribution⟩
| SHA-512( ⟨depositᵢ.sig⟩ ) | merchant.pub ))
@@ -1351,7 +1354,7 @@ In Taler, interaction with exchange, therefore called wallet-to-wallet transacti
<refcontent>National Institute of Standards and Technology (U.S.)</refcontent>
</reference>
</references>
- <?line 1392?>
+ <?line 1396?>
<section anchor="test-vectors">
<name>Test Vectors</name>
@@ -1364,7 +1367,7 @@ They are generated by going through the protocol operations in the following ord
<t>Pay for one <tt>order</tt> with the full value of <tt>coin₀</tt> and a partial value of <tt>coin₁</tt> (cf. <xref target="payment"/>).</t>
</li>
<li>
- <t>Obtain a partial refund for <tt>coin₀</tt> used to pay for the <tt>order</tt> (cf. <xref target="refund"/>).</t>
+ <t>Obtain a partial refund on <tt>coin₀</tt> used to pay for the <tt>order</tt> (cf. <xref target="refund"/>).</t>
</li>
<li>
<t>Refresh the now-dirty <tt>coin₁</tt> to two new coins <tt>coin₂</tt> and <tt>coin₃</tt> (cf. <xref target="refresh"/>).</t>
@@ -1388,13 +1391,13 @@ They are generated by going through the protocol operations in the following ord
<t>Recoup the value of <tt>coin₃</tt> obtained via refresh from <tt>coin₁</tt> (cf. <xref target="refresh-recoup"/>).</t>
</li>
</ol>
- <t>// todo: sending full coins only works without fees, should we set fees to zero?</t>
+ <t>// todo: p2p sending full coins only works without fees, should we set fees to zero?</t>
<t>The test vectors in this document have been generated by the GNU Taler reference implementation written in C.
All binary data is provided in hexadecimal notation.
Big numbers for RSA are represented in big-endian byte order (most significant byte first).</t>
<section anchor="test-case-1">
<name>Test Case 1</name>
- <artwork><![CDATA[
+ <sourcecode type="pseudocode"><![CDATA[
exchange.master_pub = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8b0217f38b095
b4313b
exchange.priv = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c750eabfa0f7ac70a2442
@@ -1500,16 +1503,16 @@ merchant.priv = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670ae2e5147ce84876703
merchant.pub = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0c5e880e3e0d0ab19f0
merchant.url = https://merchant.taler.example.org/
merchant.payto = payto://x-taler-bank/bank.taler.example.org/merchant
-]]></artwork>
+]]></sourcecode>
<section anchor="tc1-withdraw">
<name>Withdrawal</name>
- <artwork><![CDATA[
+ <sourcecode type="pseudocode"><![CDATA[
(W1) reserve key generation (wallet)
reserve.priv = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56d128b1432e55a6c6ba
reserve.pub = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06e73f4287148cb93c38
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(W2) coin generation and blinding (wallet)
batch_seed = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041494f8bf1f8cd30f113
@@ -1543,11 +1546,11 @@ h_planchet₁ = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd3328fcfce41fbe931
aa96d91fdd77599c122cc5390ad7cb86d2c6d4261bd5950e7ec0f86959613841
sig = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f1cc2e96e9ab3392894
c65ab6a0af31ccdb395db5c526770077642502e27d4619d385a91dd13854e706
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(E1) coin issuance and signing (exchange)
-total = KUDOS:7.7
+total = KUDOS:7.7
blind_sig₀ = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a192f56fde38ac9feec7
841be59b2aa993084c50f70dfd9673dc723eec9d84c28ebd5f8104d1b0b29cf1
18cd64cbe33925524a3363a1a6f24f59d47a404cf74680eee97cdeb8cc44a0b8
@@ -1564,8 +1567,8 @@ blind_sig₁ = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec81649256215f13a8965ad3
f2d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3dfe7ff20ec85fa4d
5e5aec24d89848645ffadb0de3da80c6e41b96571ef28e3d132b7c3fd16a289e
32389cffb653b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f5034c8
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(W3) coin unblinding (wallet)
coin₀.sig = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659de7512b599e7e6524ad
@@ -1584,28 +1587,28 @@ coin₁.sig = 355aa5b6bf10591375f22a014640cd242f470834759fab4421b4d237a149b
d69a5544d0054716dfda47791546c177223606c0645858a15b36887619a9d70a
515f42897758bbe181765d7184cc92b5e2d743df1db9b30394b697117ad24811
812febe0a3c57cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f516469
-]]></artwork>
+]]></sourcecode>
</section>
<section anchor="tc1-payment">
<name>Payment and Deposit</name>
- <artwork><![CDATA[
+ <sourcecode type="pseudocode"><![CDATA[
(M1) order generation (merchant)
wire_salt = 4c5249caea865380e0e519fc38177686
order.id = ORDER-40
order.price = KUDOS:7.42
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(W1) nonce generation (wallet)
nonce.pub = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7da63194e9ef40fcbd0d
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(M2) contract generation (merchant)
h_wire = ec4e7258747a4de49628a27907b74f0aad097cfafaa595320f81786375430b67
ae1ada754299bbc0472f5a1e8bae6fe8e5dc52683dd09490ff06fb2fa4f20ec2
-merchant_time = Sat Feb 14 13:37:42 2026
+timestamp = Sat Feb 14 13:37:42 2026
pay_deadline = Sat Feb 14 14:07:42 2026
refund_deadline = Sun Feb 15 13:37:42 2026
wire_deadline = Mon Feb 16 13:37:42 2026
@@ -1648,34 +1651,34 @@ h_contract = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2839a9a539d845a5da
622498e3819cb49206810688a93de1989c6542d2cf1d71f64dc998193e76d535
sig = c249ee766b4dd256560d48b367d05a41cf7169306247ec56c51c39412b34c110
15e365c2b2836761ba020b7175e60870572a6c7f780eeabb6f0777783064d602
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(W2) payment preparation (wallet)
contribution₀ = KUDOS:5.12
contribution₁ = KUDOS:2.3
-sig₀ = 1799394abc575b6b69a071949742fed8cd076c70403dbcfa0ae3baaf0afc0983
- 7b1b301b95cf37c1407566b75c9ae1f79ec7a7d67fbea81315e4f30b83067a0c
-sig₁ = c4569c0ab233aa265809dc9481740663a5310c5887f96f28872fcca81851e66a
- ca66c65696e226aaf18752a02319278a7bd18f3fb203477a88d28b8e5061bf03
-]]></artwork>
- <artwork><![CDATA[
+sig₀ = 8876dce4ca504df355f17c783e8327ea29b2cbcd7dde608b473644af3580621d
+ 3eb429022f6d1c4937328db478c6ed9784f6788e2e18dc16927efd4bc9c10908
+sig₁ = 031283a02cb413308cea4b69bd3d1b7beef87be7788fcfc1d7b83f8d97cd4ede
+ 218d0f753ba8fc92e22415a66065f5c1dff402368de8e85eca0c0ac7358e3602
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(M3) deposit preparation (merchant)
-]]></artwork>
- <artwork><![CDATA[
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(E1) deposit check (exchange)
-exchange_time = Sat Feb 14 13:45:44 2026
-sig = d5012923d92fdd984109eadd60234953d6bb5b1bd3695a402ad32a155e3f3661
- ffe6dde8bbb0d7ee58342b8a0a3296e5eaa8e34655360e6138b7d7fda4eeec09
-]]></artwork>
- <artwork><![CDATA[
+time_exchange = Sat Feb 14 13:37:44 2026
+sig = 09338dd4b1e692431290355b7df62d627a894718db68cf4a8e083bfed7b6c98a
+ 0dde3c5724f3cb3db0e6737f57c9eb35136997eaf403f27f82c0a9f1cf27d308
+]]></sourcecode>
+ <sourcecode type="pseudocode"><![CDATA[
(M2) deposit verification (merchant)
sig = e66d503c843d72da4b6eb95f872396449de25cbf80b9c243d8c9ed2bde533d24
60542c685bfdbf2eabc755510a60b97ed289711fd3f353cd80aa791e2e2f1e0d
-]]></artwork>
+]]></sourcecode>
</section>
<section anchor="tc1-refund">
<name>Refund</name>
@@ -1717,460 +1720,463 @@ Education and Research (BMBF) within the project Concrete Contracts.</t>
</section>
</back>
<!-- ##markdown-source:
-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
-hIaOSubYE9F0tFAl9XTzB3Al3Q/SKrbpo7ne0Bmt1QlWfeuaNWsTxFBOY+0w
-TNnaskc7ZHR2TiWZ1BYOyvNQ3ltlftj4SpN6ZYPJsPdw8prWjdWxZNxmj5t7
-UYqlKoHXJ+2+kpQmwvguyqnZgaKJo2qw9MaS3Z4cM0qfnlM7A85URf6SKsDn
-zp3l2KYW71Bm3tZuzcxit2mNclBm5RqdUZu0FZSOUDM7aKaNTOlEnfUyN5vl
-TVEi5bNflWKpEljleD604rIhYGpKjE5ONwNH2iBlhOLilJht154qxptE0q5z
-xzY0oHv1dgazvFtLXcP5zGSxHItTIZkA3aSRJ/tnrxrvQTOboQVRyaFJbDSL
-YfUwd2/ey07VzdBKZhVFVyJpH+nVcKpxSgQH08ZUqP3ZyZePq4huZ3UV6vje
-U6oJeHZ69OXjZ08Pj5410Vnnemcr+WcWPBt6tiFKqlXtZxxt5ypVGx6uLlOt
-0tkQmlYCnn1598t9Uwcx0FBL17Cq3e3qwierp2af0wmEpTqw6AiSfiJH5ngL
-SKWtO8mv6oz+a1ktYNCao10jsQezN/PhtAw8t+1Vy8CtXirCDd9Wwqck892O
-mY2u+pfOMZu9vFvSYexkidbXl+yyT73Is7s6HlpzbY6npzbe6OW0lTVOKh8+
-vXvvyZcnj57tGqfVb3BuZTGyZ70WXSTpMGuS1eyM2n+/uuJUvVg9WWlc8+KK
-7rXfaixA/MZpLTsaLFY93nUTl5vytjoHdahFtejYUqvmYvquoeSOWru2wRFZ
-HPvUWxJmWoQzM3+3xp5d00+j7KoVdFXFc+shmNHnSgXkm+mIVnlasmZN+Ibo
-d92EVyu5tqdhc8RKmg+c9nqOOt9B8dBp3HrbMKMtq7lmVd/pBoyP6Bun0MAH
-vyTLuR7YNasg2p6umtaw4fPqizfzfpsWlWmXf5NJ5XhTCcW6+l1bR2FabZRR
-qNX5ji5rudishD+zsdlqYyrZbBmZ+uomK2Pn/JPtSKe3ayzXWyuy26Stcn3v
-b8l/pfzCPmu2Q5nii2rnnOE/LbfPRG8OKRfLEW3mbmwcUOCW5LdXk5Wc8uv+
-qgJW1YxQwPuPnh63mb7C8oqdTTqaSplu/rVh3yrPu7j7/XYb11Gb02aOLc5p
-cb+78Ky10rpmTghbd2YPmpb5J+LnD8CPyup3seNaj/5zcqNT9dpZqxpobnAb
-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
+H4sIAAAAAAAAA+292XocR5YmeB9P4UldKJCJCPi+oBOpgUBwEQWSSVBJUUoN
+YG5mDngxEBEdC0kkxfpSmT2vMLf9fV0X2fMAfVPf3M1V3dQ7VD3J/McWXyI8
+sEgUS1Vd/DIFwBezY8fO8p9jx8wHg0Hv9a4T9HqLcjGSu86d5+fSuf/4K+c5
+G8mZ83Q2WUz4ZHSnJyZ8zC7whJixYjE4W8rFnJ9P3gwW9OBgah7scbaQZ5PZ
+5a5TjotJr1dOZ7vOYracL3zXzVy/92Yye3U2myyn9ISQU4n/jBe9+WIm2UX7
+2it5iafFbs9xBo7qR/3GZ5fTxeRsxqbnl+qC5Gx+rn6bsssLvDnv9T55LcdL
+udv7xHFmcjrZdc4Xi+l8d2fnrFwMz8bLsVwMJ7OzndFcuCBsiMs79PAI9M8X
+9eO43/H4Tq/HlovzyQy0DdCz42jmHJWvJiNWOvf/v/9Xs0fdw4u7zvOv7jp3
+Z3KOkTlfjcvXcjYvF5fOpHCeS34+nowmZ5fqaZbnM/maXrDPq8vEIAnCHsjR
+xflktPgTLgwdz1U3OZrabT3OJwL03B24nhtn5spyvKCJuS9nF2ysO5MXrBzt
+Ohea7mE1rf/HYjkQurmhkL3eeIJ3FqCaJuPZvQPftb94bmh+jdI4M7/GfmCv
+JkmYml9TN/Dp1weP7t4DbU8eDj0X/3OTnSxJB8EgDv2BF+LdQXIShHjw+MFx
+9Vzs+unO44fHz4f3Hj49HnqpOwghXhCyirJebzAYgH/gDOOLXu+P3zrPP3/h
+/PE7feOiFGKEsXziPAQjJmLJF+Vk3Hrsc/mGzaSzOGcL/KecOxD7JUmUg9/n
+i3I0ckh+B+WYJP4MDJo7bCycC3YJ/o4XrBw7cjabzObD3ldz6aCZy8ly5kze
+jJ1ZOX/1K+r98WTBdM8D5/QOy/mdUwd8nkDw0Kl0RuVCztiIZrwcnzmneOLU
+kWOaUeGwubN/fPDwofOtmoXvqA3mfO/k7TZADGniWHVEQsacN+Xi3Mnp+ZEc
+99nWSqdyfIb7oD+/pGt4hS7TH5YQRu9OmfhGzib9y21ntYnWs9vOn/DYAI8T
+1YtJsxO0fam7oRbzcjHvv9063TlVl+jXVrMX5bi8ADvGy4scJgkv0xs7msyx
+5JgDNrukLqDomBGaLfXecrQopyPp4CIv58SHcgzjhDbeUr9L/EXDWO3v9PIU
+hLL5wpmXZ+OyKDlDi9SnZYpt5vTtaXuYJAp2osBJGA2SFs0YGDK80s/LMzwi
+SjbeskS8VEN+cy4heacvT0nUmDOdwDxAqqvOzPBxU/7XZfka1pDGOTHjeKnG
+QS3OQMTkon/ZGBVz9MXRpXMmx5CtBeiboxnQKs1sYHhalH7t5E7/YiKcx2hh
+R11pXWpNjWYxOKTEbMeRb6eTMQgrK7nbPAtEFzEs33bQ9nI0cR4TBdBncPW0
+LPDf12xWshwvsznNhVLE0z3coPcg4qKkbiAbkymNakJtkvpOnFwzboZeabCj
+8hVptSzh0i5ht8c7XyxHJWuwUo1esAUbwuu0RwlNR/Ow1afqFkZAVyf530m+
+0O8oxrvD4bj9onzLR8s5TSL4f6Y43Z7NuVPMJhd49VTN5BgjK4dyiOG72463
+7fjbznCIP8cDT3Xxr//9f1J3//K//se//vf/51RpNMSMKdMj3y6og9PS2XPa
+pKBdQ+1ck4v30VOlLVpYL+QF3DbZF91eOV5OlsTPGbts900cuk3/bKxbsepD
+9BielkSe5ipMFKxrJ61kNA9qp19y4JLyQqkHPP3ODpgn4OFhhDHt/FzxWltv
+OeezcqpkEQyeTy4kUXwGgYOYzNHGiM3ojoUvTrEcK68wd/pKQmDp59NyRvpy
+CfP+dgu0rBLzAOjDuWdfpAc+gefaH/hR7Lz7ZH7O8Mv7Xu/v//7ve+Zy/2J+
+tuUMfuecE3DpPRxPl4td5Y9xg35gQnAJcwLbpgXHmM4vnd86/v8Ze86ELyTh
+nCfLRfUytaYaMa+J8gxYht4uyrekBboNovdLoJA9J/BtO0Rc75QaUPZHCbhq
+md62g4FsYNKcY2lYFA4hoxH9J6b/kFLGQ5/e+NZggO+GNTsiz9fswC8NduCv
+n8oOz48+DD/i8Mb8oNGs88MnfvjEj8DyI7yCH4qrfaBj5ayFvbxV8Wmg7rW5
+9SEE6INxbEWCntd8MszjkxmsDLyCmFsUUJQztFm9ac3COn+FLMqxtk7v3hnB
+eb+rmbGQF1P035SgnqJ+z6Fb37q7gfedJgp4qwnptK8gkyDKoqiMsGlpxwh6
+o+9vAUO/o1+074fdgcdRfcF1LCWmlGzCkWHZPuIC8oDGJx4ADBib8OBo/wAz
+e37B7IzSlQExsw8buO2QDVWzClZgXpTd0vPywMwLbxkeRYO1WBrfGSa256kl
+IOhJCchccvhG9WctHWxhoI99k55Upr0SKTLKylrPgBkIeOlX23IEMhzz08zp
+CkVav3BbqRdnI74cKRVYYb2JML4zTH4Eau/KGXy2GvKK0aW4ghj8ShTvtSxS
+d2hpw2tOn97YcpZz3ZuOeUvlsWD3F6wJZL41Ec53PcVoIDsjPwRKWjMBgZrM
+lLAcvlWRiLIEh2+n9GO+kFMa5Hx5Rqplhkl0fLfbO6WfA/PWKdEFL6iEBNIJ
+4YTXfnNeAg/ZB6nJ1ecgwKdOnxdDKI2StfdbQyNueKk/Z6PFtvPw0dG2itC3
+nS+VyD15dGTEZK6nkJ5TUzg1GEtdUBLv9JkznowHRoQ0uNS3tv6Lern+VxZ4
+dEEO9nUJWIxOdSwlFXhlNl4Ag2F8CUsjcqL3QGDDjkFKlduGiAARjnr6TjFp
+EWhRCLGZTWtYOp8CeQLGO1WwOBmvUNkHxifMyDScN8KqadtSz35pnqxDGCPb
+K6TRdBqLuNLFb/ccP4p+Dbu356Re7G61VeaJGfCmdvvo8kvT9NaataW31xSp
+mIxGkzdzYzGfPnuEnpsSVsvClrYeD7QBtfa33/SMWz3qo2qAJK+PJhtStNqE
+cm5NV2HItqo6OJoIhNyMtM+AaqXBLbOvlPn9tjbdla2D2C1nY6WoRJUy7iRV
+iBNJhfE3wdIzAMTxVXHg44ZiEDX9x9vOin50K8djO6ubG28p0b+1Ft1AjT6C
+Ht1O3luT+bgh8pAOCvkMzEA7yocIBHqzCyU49tdyTm54hLA3t0LGdBqMzLx2
+5OWfSFcWil4jDfYJxDE9MXHwRzlS5P7Weaxpf2v0YNWYOt87FI17cd+0sbWt
+8xz9x1tb1aj31EN9lfd4vEWBe52fQ7e/2XM8qyjOYwjI56MSM3GMAJhB6i2a
+OBSwJl4GliivpXzAobh7vN9wXRiaUkq+nL2W6nEyC+bN7V7b1xoYS4De+jtK
+2MH1Phw7U4ZgjUzLbNu4STFBhyeQyhPMGaJrEECvmcanMJEz+wdfvF3pSyms
+za1pTKydu8lPqOwY8cC0MLgvF0+XeX8KH640crrMW6iGbtifGLftmaSqLXZ4
+0TE/Idit5zQmwY1OTEKRZL7GqWG0wqsW1RgRBtRXFCvat6nfFUW4ivSbUYwX
+T5W2auIpBfKjqN/uAV3w8/Uck0LtyplARY07UWTvGbPVh63f6hGle07XlFWG
+/xMlx2ilzSi6aBhkI5t5eda2uZZPlgGWX5ZPNvKxsYvOAlHeSIo2x3HNMT+1
+Sln3Y1/NL9Wf2n80+9EMx3u3EZF4VUQUH/4AM1dcrnFCX+6DlYoV20RkHRO0
++GHkouKHlo9VdmgG2KFtHj+e78bwCEHlNnkgek3lJiEYpWi8TXCXXm+DehPT
+8cmFtCHeiEILfi75KxXmNXiUrPNI2YP9s5mUZCS00fu6w+aNRpTh4c4BGTnn
+LjB5KQcP5Gh0Ab/RPzy4+2CLxte2gR12L67tHq1ZQBtycGAmjWWttG7KypmG
++JMxyZeohscsscoESybohvHryg0Me3fV4pby1WNK+eK1mUkyailDs2YiyeQS
+H1V0am32StxRhxyk9BTHgHXvdnfBdKLjfW8uZb2UVebziSiXF7TYlU8mr4bl
+ZAdGeIeJ12zMpdiZQ6LZ7KSd1r1lG9IIcs1vELRjAl6ajYEV9acYcsMqKqU/
+xzjEjS17h3n8eoPd1y1XPw3oypvgU6s73rTpH/1sh6obYL0NjtNUKvNooakh
+oMuxtsSrYUY/rTG3Su5ok1nnNcu56gaAweEjdjGlP5RUNNY0z5f5ELO+83dS
+lHO+8OqZ2slHk3znAqonZzvzGW/c0emEE9JkO287M1l47o6R8yH/5MvE62lG
+EJl6dIrCT40zMxytczHmaWP0V6Xx/uOvHh8+Pzl49vLp8ycnUog5O5FcnG+U
+EuNDbiUkX9/Yhf6yhQQYjdz6wWT8Ws4Wg6cTAMeKMweVhvWnagFJ+e4LRCNq
+DVyvyZUaTQEwX7Bp0+qGK+bOyuMyp3m+vsd66lfkQk3Upz+bXNwWCW4yCJvt
+xmYcyPlkpow3sMUmt1HzcZUt2c1GjjHLE9BxciYXJ5o6wwM4wO5Y4Nnx/uDe
+3QfOu09mczYoxPl7C7aW0+kEyB0kN3JlRIV5pa8wBnpBh4qdeLkNM1ZgleWd
+SiOikQbsoMBxTjGXjkTVot5yjliZZNg8ZhcIHdmeDXSreimWo9EA/pIW0lVS
+jRoCBRNIo+l2+NjMEN5ZnaFKVW1Er+2kTiMMQNH79+uJERW57Tl3NEv2nXvP
+p/MXv7rTU6H6no3odBxnSdjaqmO91h1pAj3cts/Wv8oejXOvoq5qzqYd1Gyo
+tEMd7mKWyR9TJYAasQmxVdKSsDkl6NkZI8gBbIagueQlrdyZySGJBp59beGm
+zYTDlM2kKnZxSBopHS7HE0TNtI7q9M+42FLreapPG1woYhXTvWFLjgYqvSr7
++at5S5zWUCseUOzJSZCJHBIcY2ibqxTNpYWfR+Qsvu0SOaKyS+Q6EtY/SeQ+
+t1zAu5XAta6CfJWrw5yo9QNQc+c6KVKT0JAiZQpso+1pU1e1Ebh26roswS9v
+OqsYjijCzBQTO4s3mENrSM0UWmvaMYNqGWTP6TKjvVl9o0sverMTSZEzFVZY
+w6DrKyrr0qPR4BE8+Gu94rJyf0M8bXtV8TS9t638oJ3StZhaNW1/NgPmbb0G
+otOkrUycaQ8qYb0sTZyaxzpQvnoizXPVTN4kPFcUwo6ZDq+MxNszRc3t6feJ
+4YZ8YThqR9Nk6VfjvFNZzPU+WryButhhqHfqwfxC1WY5tgpTU3rVIl2bx9dL
+fDmmbFFJqFInCmfdIk9c+7Wjn98o8yu5E9uzyZ3YtMntrVmH5BWW58odUJbj
+552Ha7MtH82KgVI7H9fZqb5uZ49G11jkORgxoJTBMZW3zmZUxXMXzy0up1JX
+TdaFkHh4/4Ly33NgWKZ/A4a11yi5sVKupDNAVIFhC+VUhcJgSgGLXkWZ99rz
+caquntJLBH9o7WUsz1iryk4lXWztI/hJaaOZHPPL7Z4qXSrIF4PkUxMIgpLl
+2JQGUjrofDkWFPVclKMRHoMS9z05SLc2tKlwlf2zoiwYeJ6p8uSImdAjVSmU
+VBNdYbi6FQCxF+dyLF/rjJiwlQq2pmnbBIJjWqyvuFgXho6dU81xkqeeKieM
+w76+NNTLUQbrBr69bNlAd2xFqOfDaejblrStU53Je15CyxbsYorgYz+fT0ZL
+qsioLq7NL/hg6WiURr5drSbp6fJQPpvAdKpriLQ5nvSyxB24Hv7nuO6u6zoH
+h8fPT50+Pf/V44dfO3I64edbQ4Wv1bIW4mO9KHfqvr238u+0pm3u3FGMvjPs
+/fZXg0Gdo9FJTVqmk9JWgipi+aL3TI60kP2YEUPFK0lrDvVH0Q4sZKgfDH6n
+ZqYZSe6PRtYazltgoNY3UA/9UGtKzDmXjEpaTd2zEcsSD5V/ksSAHjNVQ3MN
+UaqFRQDWGdQWcoVhz+RZSakpMmCXzv39x/tGgHvfIjAewyFWNDpP9Xvz7/pV
+5ouNWbM+X/86qKzl3Fw5qa8MzxcXI7gk1e/scqiHNphJbUUNbXMzVsRKnuu6
+Jtq5L8eDo/mZHUC9WtGRnVdPNFyJvdIeM9qnMXeuYCh+wZr1qZB0aPi9dcXC
+hnUiCOimI7moFzT60ItNLbT9Ca3sdnl4beiNFaACchp5wzBUU/p9vRRA6/xy
+RCVyjeTDcyXaJP/M4XKmSubr0m5KlY3kgM3OdNl9neDW6S2mfDK4YhRNm1DK
+oksSbgcBrA5uYcjx/rmc17XscDy0HFxn4XRJ566qw380xlgVSjy1C93SlKCe
+VvUFr8ZUyM8INU5mpWPiaC0oppOqkrQqM6PWD5R5IMU91ZF4qUqETQP5ZDKS
+sMNVRTOtAlS1z6f6NVpRIWzQo/0kDssns8V8Q4/OhBjyppxL6vsp7TSZL8zY
+pvqveSOZaQdpavQnxCO6RL7KVkVj7r+cTF4tp6SkqmAXUHVWwprMqfThNWUc
+Rpe2dQiQabS1kqYqfanF4+WFs1LLjOFpoEPxGuQBTCI61mqBHZLkpcLMBifY
+WicLG95vEY9ILJq12HWTc3SuJ2tuq7ghlse0TKXKgmuRUxOkVlNVggTj00mX
+89lkeXZOGvHuneV+VZhIBS/AwOPJRV8lVLacPbWTRedAjba4Dc3x6Hf16FAv
+DqsWno7YGE5l0Z+aX7adjubqX6oGnEbT7lvVuG3CQeNKEgfHy1xXACnHAbSs
+/gaKELp9La/aq/xur3Eb96w86buD1l2t9g65Ju0wdKV0tY8M6K5iWKNyO4ck
+FWBvafblSK2v5zOpeK8RM0wAhaFgBMyhKvKG+ZUz+nXxX0zxt/JMGjmJkp3N
+2IWjNloRxqx9NZuWC1X5cUWLnynz9SS3ru1wcKBKbQnXvkAvYsbwMsbzxvxh
+Kg51i9U+C6q+d37nuARdSogUldHTb1bsSUxntBODVJKK32s/pZ5VQRk5L/uC
+wvRmc4EmuccW0MR8qWCunhSjyrrLVtaauuDnMNSNdJ+SdVXfT1dMRxpfLIDQ
+LbogUt/UIy8wN327gGHU3NKkyqKb7W/1LpYQGXI6JpcALcew0Y6hVWsvbOlk
+VkNY7Q0oAyppbVdpH9mHmoxhY16rvVrP9788fHZytP/1ycGTh4+PdWE3kVRb
+yL7QbDo4HqgNO7o+qWoKKEWa4eoEnAOVHwvweaoIOPj8WGu70/hnpv7af5ZL
+Pe1z2ozf/Nra00NKXuCVlRosKPwN/33f+83gqn+/ueLN753+CxgXOzWvWrU7
+V5DwU/r88eNcvdDo0OnnbPwKvpWN5wWBo8a933X02Ye5I5+xa8c+VLUaWn53
+Tf3eh6W2+7mr+Tj4zQ2b+b4y6P3WgGzk93Gp6aDvGoHZLDZaSP0tZQeb0ql2
+ndnMWxchP6XPHz/O1Qvt3pwda/Wc9o0uIcW/9mxaCDA3BUUfntru567l483F
+tH/omaks5/MlFZuoibTB5UenqIPGtTd/25i//ro732pP5U+Zjg3D2mxOqzdJ
+SQLD2eX4Sr34YH2uXrjujfpNhTB1eqRPnvjZ8f628tMExxHqIo6ncmOdndI+
++ipH1ddOG0/aB+oCRlu92Vs1kNY41mu0xvULlfqeW+DVNDM6uT83xSBMV7or
+MMcszJlLSj/IJrypEct2bzE50+ViOv1SL89Q2v4t4TXEUGqbOg0faBphLHul
+ehvXZSFm55MErh2ZdJlCWtR3SfupKY1IWSLAd7W+zMaXOp5UuVGTs7woz84V
+nDNY0uy4tZ1QDbatURtdNjGaUQDFjB1ikwIxzacbW5Qp7aSg3OHXBw/2H98/
+PJlO5osTy54TFXjvIPykYP9EMR1R0mRJUbNOyClW6ckZcAru+gg/coTVlxs4
+QoJVic11rqMWnpwt+PmJYmK7JNaKTv1Aj6S2pLHRLlnK21Af6haMgi0sNwFc
+SQXk1avbzh192kYtIAN6eSCqvU13ttVWDafFaN1us5tvA3/3O9O1RZKrj+wG
+fuuRruLe5vvU6/mJBac0kJVIGFfpGeuK9EPthWgbzjY6JQ60x2IiYXtfddtu
+tDuCbr261atcIi1gwDbXtMMybxPQbrxIxrpH+bk9x+YAX+x/+eXh85Nnh8eH
+z/5wePLi4fMHd5/tv9hWxg2RuclxWFKVySCA//3aLYRSlVBbPP99Hdor2tq0
+VEE+lQu6b91WzL/219aWWQRtlVtX+KAqu24FQDpGoTJPXWdbF53W0qZXhBv6
+pR7vs3zyWm7t9kysayWK6G6L9/hq8TZbY+YQ6sD/Ncz5muqsS7lq/k7+il5q
+do7GVTNb61KvX6GLG99Rhl4ZhatBSN/yDby8kUyh+0oO14fXUKY6+1a3WSVq
+qudMghIU0Xahio/yrdrD/mM15d+x3Gv+rBTXt5BxVWRvnrU44NHLA8rsLpZz
+Z/KK0hXEUZ107um0yN7msf7m2rGu5OEsSTmj8QJhqC42S7xCkA3zqTdQdE2f
+sc3WETWwRaXsbyjPKd8yQg2fOXNAqZHQzh00UspFbdgmUuBqR+zys4Y+dEHH
+2i92+joiStuj1cKK5uBuYPb1hK2s/ne7kEa/6+3Ym0azQFhLx+ztJj14ZtX2
+NPkJ8MVey9YjalG/gRPYaCaZaKTMP6vmqJUjrJfTn0k+gQmoU47AunSlzqSq
+nOVTfQaWxj7NtKW9QebhrlTr5pSP1Vfb6cuJynvO1dqD2Yzc2PSnRIHWjdWZ
+No2cpE2e9lhBO9n4iJUXJBBltWZ4Op5AvE+HPUuM3fyvTscp1WLClJnFwMqq
+qt1nUAfMnCZbH75V/qmVvFS3mmejbMi5oku78HR1DnTbBBoKIOtVAzqjRPFE
+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
+JKfTXBfVxkezKdHUKOnGegavKNyi9qSr1MCnlbJXJfv6lId+VdVD+6PZbDG6
+3KJzcGizM1W5D3v7isktFhCTGNg7Xaj9xtVAzPzpw0h0dZMu1TJHL9SVUnrP
+JoGjYbOwy0AwcIhLXd+PlmcSEaCZQfMnzWDdh5mKuT27Fncu9JlzPbRgKFiO
+MS+vWF6OygXV/D+EsNBpJ4u6d8yBHBVqdLqWyLAMjbSKh7Z7pZZX9fGMleqm
+lewTiBtN3jT3GJSFzjJRMRllkwCCt6uPPc0XsyXX2ah2pkqdE8YudyzM6avv
+h9ljTnK5eENCazcM1xpCn3yzpUg/U22TXdZce+76qiYzmhPj+PXFyg1s+rc5
+70pcaoCUnznRvb6EeF071bbUprp0LGl+LHpu+uCN2+lc7TbD/VHr3U6/4XVu
+T881D/74djYuNXQUkN2gns2wSBk+fZxy1zLlR6Bnhbirb998pdtRu6kgFQ3t
+bArGbSjSp0Ko+KW54k0LF7cf29oqt0q23W5019z+wOvIH2Ch2/D951nn/rdZ
+5nb6a8vTaiaJon9vlS9+PUOTcVHasvZ/T5UveoHant+CqEkPyGRDNR2353ZT
+WW9e99Te+dAK1NSHi9QhgirLcFEu1E6HG7d8zQA+ZFms34ANhLz/I5TF3nK3
+dPNkclqg+Zf/9bd//cv/bUrY63PYuyDWj10RWzsR/ap+ux35epa+QUKdB7Uv
+TvBWPpI9k5HXya329oH2drtqZbKk3b2f3XCb3nry0npVKiHQtJj4slKf+XSk
+tsogSrrsyrNWSYNnh/e+enzX5lhXczvNLbvfw23jP1XfK0lPQ8gVSzrriQ+1
+HnOreVtziWzV9DYT7u2YZcNk1EyrAv9cNs4fMyGr/iimjZ+oWxXsKaz0q2rR
+tGaXPf9zJW66coYpDrrZVH2IebpZXqi1dtY4zYua/t1eV9vV9seWlqjPVk1U
+aljlC6tccb22P5MXCLZ3llNKZzg2tSzaz/cu2ExzWrOYMgBjyicsrmWdyoxZ
+O2KncmurFgBawFZHLOiP4FnzpgsimKrn+KPb65bu9Rzu7aV7E5xo2qU1m/GR
+Rr1hrWItT9qSF8cxk9nOl+F6BTJoJbKOEuyOTYoQWssgZGO3ejoXtaf20IGP
+9r1qc+ON3U6Xi75is+mNKawsMi0OmbFbU0JfQKvrklrfPrSps879mo2z42xm
+bGS/Tl7latXrKlmrkm7dezDHp7BxbzZvZrx6E2MPDKnyivarVZMRnTuMZtYa
+cE7VXx0HzQ0bR3fqo/lmks310ZyNrYCVORYT9dHO3V7PG17FDJNk1gejqFMW
+WesYZiLz07lJaIqlLvKqku1rieftHqWP7Qm6rQVNuzHT7Mrs+TehizUS3Vb6
+6lwp5djfb/WCIWYTk6RpU2bOOKBydfFVH4HaOIWyysDSiXpUhGcmwBxsqua+
+NcWfmuOtO07km288ku/6E/hAgy5105y2G3MrSRlqwldKBiXj55V4Us5WqLR2
+Jadake1RdeYYU6iTOrMbc62PzBG1uFGHZsqbXZ1Wh8Wc9iidzxz6WhZ9Ests
+yKYO9ReGKttxunL2oVE4c0K9OeLQvF6qU3l1KZ8SAv2VZzxACBL+TH9FvUGG
+WlVQJ6ZCbup0tJENuqi+vPxc7butTsyQ47k63FGVYLbKILV+91vdrdRobunt
+vzOzA7eqe2ydg6smntnzOSuHDayppHwxWyqApFYK6KwiWv4hrTtnU/hjNapp
+Y6d4VdROdQR004ir/f5Li6fmG0+ts0rtqQT2eJzV823sK+bwj5scaLNyzker
+h9WDPjpP+bjmjU1H3VTn3FQnql51gE3H6TVXHV2z8TSO5lEcjvn0sS6iWm28
+fqNu1lbn1F9MhIFaLgaY2wE/n1BdTiW7lczrc7upDuqCCkud03/+x71AHREs
+yf9xaaWwIdo9Uo8uJdxwypXakqM+sFAdxKNOPK2OSEATyoH1YVj6//yPA29r
+55//sfIKVBG8TZ+eVQcMjNVnJjkVO7KRPjmaUCt768jXTH2WuTrXezmuloXo
+w+hGgM355PpsZOrjzUSpiPFfR3JkPyPQNFImkLm4KG3ZMChUI9DHTttvalRz
+XBnIOXmfZ/K1Ohten8RPQ6zOCTtVKR19DFeTG3UNtVkEm+oj2NW6lm2JbvXt
+21s3JGj4CzrR1K5TgcO3+vehT9C79ig7p7HopMi9MIJyk45/Sp+rF27w0oY3
+V/t3dmgMzurlDcdMakPUVcppUpNXUGs8iTHCXUdU/gIOqLSzcsP2zALAGbu4
+YHVBsbETkI8PflzlLenroHjtzWpX2z/9w3bXprSq05/hwMpr5b9K1hooMKtt
+6I/fvnRtn6sXrh3gxjeb3To72kgP1jXuCnUjb0MuzqT913zEL0J1bqMvajeN
+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
-->
diff --git a/test-vectors/test-case-1.md b/test-vectors/test-case-1.md
@@ -0,0 +1,281 @@
+~~~ pseudocode
+exchange.master_pub = 3cb5e9823db2b335fdb3f284ae960e56be8b081c6819b8b0217f38b095
+ b4313b
+exchange.priv = 1bf4149fa644b3c7f2bf02da4703ff2de3fa160dce0c750eabfa0f7ac70a2442
+exchange.pub = 4c130aae3246831808a162e2d4330de394e5f0d7dff75a80f3fa045b1a43eabb
+exchange.url = https://exchange.taler.example.org/
+denom₀.pub.n = ba42b9e75e48847bab175ed4797384d68a430fd849a914aa68438349743b2728
+ d9ca97709c15d5c81c7d9d11c84ec9c60cec03aed4b36ad153768eb30cf98454
+ 74e97ee9d7475ebc926d87135d56926b7df1cea3ec38897a74bc3e245e59ffa7
+ 6e5aff2c2f2eb84e7133a879f4229221f91c7bddf96088e4020e16444d94acc3
+ 0708069f4a1bde3dcbead32e3916a9f6722adb3d63bb9075dde49258fbd28a9a
+ 09251fa08b64faee53a506b9f637136c72af7382b9243fa8996ad4d72cc1b05c
+ fb45271cb3187b4eeec0b5f9e847cdcc0c3ddef9787164a1aee7e4e1ee6de1b9
+ 5282c1ff646aa70aabd1df0003f75d3585e9e740916cee4f7bca0cd82f72104d
+denom₀.pub.e = 010001
+denom₀.priv.d = 07bc432fbc6eeb0f9ec2a4f5d2886d65228f57ee5ddac788af355493bd9fc247
+ d449b161e41d95080f44d93bd6938d162c4db5f6720f7479768ba73000f330df
+ 780e856e8d3a01d1778c546e85b3157820de24bc9290238782271a3694f38c66
+ 45f3420331ff70f8930377f4fea25beaccc775ce796f9ca7c97d0fc82ce7a688
+ 0dd437e6b30695ca51a58f0239aef7481932550ce61b5b085313cb888c893cc1
+ bbef6b47c607e1189f8cccb04eeb9f87b9e53f414850f8b923ce83e2859c0434
+ a3d14d861e864fd5ce701af11611398a73515b7056b2828e564cdec6052bdbb4
+ 3ff435178577198de0676e5d378ade9b31844e81e2218ba3b3aec5bff9a26621
+denom₀.hash = 8653090e3f3f5efac9770a5dd0c97813940c191c9fa1713367f8bb1279b1e3d2
+ 7f32d16ea7699501e5fc4d176725d76ab0307f9bdf9d0d263c2256a7f1c63143
+denom₀.value = KUDOS:5.12
+denom₀.fee_withdraw = KUDOS:0.01
+denom₀.fee_deposit = KUDOS:0.01
+denom₀.fee_refresh = KUDOS:0.01
+denom₀.fee_refund = KUDOS:0.01
+denom₁.pub.n = d5455fb79449df7bf548e384d5201d75f4f7697ef9b8051eb8536f66783e70ca
+ 2d524fefa6840c1f87d9d881486815d5ace866a32269b05bdba7ff6024811c19
+ 456026b0a59da4db96f58729d286c90be8cd9cbf575d346202b43282d601b575
+ 1ff77a88a0742a692349a0e3fa8ed5518fc5378fcf434929b541c942573abef3
+ 10b87776e976e81cf650a04399fabddbde677163918250c4d45f5e90ee7539de
+ 500a8e915be1d5f17d79cb9585ccdf5dba42ef53c24eae7d7c93c4e0a4327882
+ 45b7c76a587f0ac6889d30389531362d51c2ad65cb1e28b4ad4cc97fcd2a4aed
+ d6612ae8888eb2dbc4de0cf30f46a43b76cc8c3245eefe013195a237f02d13b5
+denom₁.pub.e = 010001
+denom₁.priv.d = 5a520e0e663bbeecf55d5015d258ce8145247ec62aa5d76d422cfbb1cedccad1
+ a4ce06527d17d1368d47221ce678463eff02516d6746914ce5c2c9318364366d
+ 31675e1b539866d8249f89059a4640e0cd503ec0fe13d7fa6620c07f8e789ccb
+ a4a51f7cbb4f5722bdb211f45b09a0a7f11659c88ac37939b3accfba4bccf24e
+ a260e21aaec0dfbf857178438986e963e9e356277c3badc34fc91b705d9956b4
+ bedc0947d65924d7dd31e564de798eb06837380caed6813d3761d119901c5540
+ eb74c3cb674fdfd64b67d78ebd40de0cafd53c038a0a8e87890b953b8b94a977
+ 1a6efb3142ca02db873053f8d1de2082db4366fc072aafc723c036a2fb999605
+denom₁.hash = 1de6052bce12feaa2d26e3bba1789b0c2295028279f3eaff8e1345448ba05390
+ cff49656ed72a1f7ef6ee2c4a80f80eefa0d0f906e74305b0215c4194ab1c7b8
+denom₁.value = KUDOS:2.56
+denom₁.fee_withdraw = KUDOS:0.01
+denom₁.fee_deposit = KUDOS:0.01
+denom₁.fee_refresh = KUDOS:0.01
+denom₁.fee_refund = KUDOS:0.01
+denom₂.pub.n = d1320993658042f995f09ed66ad2283e457a1f44cad96f1cf5a6299ac93d6172
+ 4a7448d70e56a38666ec66352a5810ca3e544d957dedb5789e135589fcb8b139
+ c65a2f70d7c421dfd4e27cf38d463074d286730be23d446fc07811519b068346
+ b28b86b94acff35524eb62436852714c92f03b0bac21bb6bf727734be7871b70
+ 2f928c3ced4bad9ba2d49cec6a86d1019181c65c16abf7b391f103c90c3eaaaa
+ 9d5298a4a60c71bdaf0f08246327a62399bf4c424c1ed7718cb5df178daa9710
+ ec9d098e99ed0456de2fbaf7865ba47931c52d1cac78cacc1bc451782587487a
+ 6189addfe5dcdf6f190f28816707e3d1e104b5a1f7a570b75c1951588f3289ef
+denom₂.pub.e = 010001
+denom₂.priv.d = 311849a8066faa083218b4e6444e8af44650e94ab7427d31b232eb5bb0b3cf8d
+ 478cefd54cbfa783f0deb503f02a97d226fb98f3a708a508a82c886c285bddf7
+ dda5a7b19769a7bb84961cd5f9c749b2f8ff65bb99be6033cbdb41d1418d2f3c
+ e5c519fa9d649d4a53ae4c32dea64e81b6905b831b44155cbab5cef8b6defde0
+ 9295662cdf2189f2763ede05bea0acb707b9b6b087dcebb9ca81f1c2785d6560
+ f93bf1a1860676cccceb079c22b48b9fdef68e1d286164f132ffddeab29fa7a7
+ 04e1bc3f9f5e28c39675f17136aed8542aa4470a14a7380a4016b21d43ef5b9e
+ 2b241ced017c54247c12fd6beccb7bd356820b0246553c751b3e071468c2efdd
+denom₂.hash = 4f8c487d21ffb5bb7571f5d66bcf6f93f4f5c043df5483669383128700064e86
+ 37afecd6029cb36dfc5a60d20ff3112ff1b5ad1b53c78cf39ad13cd2531ba24e
+denom₂.value = KUDOS:0.16
+denom₂.fee_withdraw = KUDOS:0.01
+denom₂.fee_deposit = KUDOS:0.01
+denom₂.fee_refresh = KUDOS:0.01
+denom₂.fee_refund = KUDOS:0.01
+denom₃.pub.n = bddb1806b7b7663d94bedbeccbb515987fcae457b5920d85b8485edac6ab0e73
+ e6991780e9f1fa6f88e500e0ccd9eeb80d8e3b66289a7cf1b25bd56d05081d58
+ 3864ad225a36f8d38391782a85bfe320d439443e8ea19f555edb36fcb58af81c
+ a5168ca7c42dda68f191bd1587b4da27703384f2aad300a043549c67fc6defd9
+ 8bd1074b3bab1bc0d89b87d81f8a1f555a3b4ce2b4ca7b0b1d8f446fa93258db
+ 511cc3bc2ff62871cb4c746f6806d0b839db8cc560da06eb5619d9d42309a771
+ 61373708db18e453ff0a1d6f63281c54ffacada7c8bf5ca7281ffe7e2e5be03f
+ c006c064d820f719e672429628837399a565dd9d70f6e9ed91e1eb0567978015
+denom₃.pub.e = 010001
+denom₃.priv.d = 1e3370867d0a0d1705b18e0d848d73f7d422f920e4aec23cea7184b9463a26c1
+ e9704d4cacaa5952b8683eb403e78a5c628cfa1b9da0e44d9462f1b7f66c1c88
+ 3b419f484ed3de257e113c1828e4e5e3592f1a3bddf78d7f88927ee99892c336
+ 2ca2c226dbd90971d68a54404d069d5f5704b304e131fb3058959338781a2039
+ 93804f64def2980210dc3f4e77c1207400e922032952cb154bb1b776d164cce6
+ 9e418844f2f4b20850c0a23d30059362edadfe00fbfa04b6833fc4606deda441
+ eb345c49b52d91063da7c55ecea7b32e99a49a823264955803ce3ee220a2cc64
+ cd4321e18ae28bb1071c7746e8a3d69adef5113e21a01cab6809668793c2a94f
+denom₃.hash = 96524d30b4398d0d5bbe2eff902c4df1cc8286629d149bee0530edcfb361c468
+ ea5fdb1b41d538223c8b3fe1a974951bb3290bbfffc6f10cbf0326585041ca4d
+denom₃.value = KUDOS:0.08
+denom₃.fee_withdraw = KUDOS:0.01
+denom₃.fee_deposit = KUDOS:0.01
+denom₃.fee_refresh = KUDOS:0.01
+denom₃.fee_refund = KUDOS:0.01
+merchant.priv = 7607240acc4563ebe2e38e76eaf61d74160d71c9a6670ae2e5147ce848767037
+merchant.pub = f54d646619723f7fa2ce79267953fdd8654cfcd0f2cfc0c5e880e3e0d0ab19f0
+merchant.url = https://merchant.taler.example.org/
+merchant.payto = payto://x-taler-bank/bank.taler.example.org/merchant
+~~~
+
+### Withdrawal {#tc1-withdraw}
+~~~ pseudocode
+(W1) reserve key generation (wallet)
+
+reserve.priv = d9641dab5c7f2474573871c25cae2f6c8924ace4157a56d128b1432e55a6c6ba
+reserve.pub = ec8ad5e4c6abcf4d0d597f0066a0e3ea0370d221973e06e73f4287148cb93c38
+~~~
+~~~ pseudocode
+(W2) coin generation and blinding (wallet)
+
+batch_seed = 466431296486ed9cd71fc207254820a2c4a85aeb0b2041494f8bf1f8cd30f113
+coin_seed₀ = 88899daa409b8c4c4a91c8e39030d247d00b292eff952e36067fbe33f2d7ce48
+coin_seed₁ = f5be0b8790719072c7043c257f2c114cd8cb45ea5d98c4aa25d9025f45f1caeb
+blind_secret₀ = a3cbe2b0babf5bdfb98f45804acf63225c16e09be1677f705393df3f5de98ebf
+blind_secret₁ = 8ea6335ed3ff8a41f9fae95e9fd87382be402d6c26ef972381dee6b3c1e9d775
+coin₀.priv = a5a38bb23a9f36564f9d4e566cdd7e3521b04f8ea4175da726ac4e3ac540b485
+coin₁.priv = ae98c5207fe31e20a7b7a8677b780c6735ce69df32d3085d504010f23c59064a
+coin₀.pub = afbdf99f1a794add25bad59c9a3f442714e166adc99c57db991947669a36b185
+coin₁.pub = aa7118596b1adf89543e9afcf2925e516a782eed9d75c8abc4a470e7efdd7fe4
+planchet₀ = 64ede0cf40a952b95af4b09b22c6fd27a1ff6d0ae3920ea03fe14a8b547f1e14
+ a2eea98443e7aa092075f6585103fb06c1d68fb4616bf33ae30a207e51840f1a
+ e655a734184a73d804df42650ce296954c9b61e249486468f7fda8a74f85ec6c
+ cdb34a66819fbeaf846b10087ffaf8e734428a907b96c6a112f8f943b3a8d554
+ 55c01b0daf55456acf0715874ff90fba45b265e2021a70997100fb18bfbef822
+ c8475820b4855f141730751bcfad2e7eb46dd6c6a400a8a6a98486c4a2bce4d3
+ 407a0d0ba612faebb49428ba3a1986eddadb04b6790fbb7bd27cc0bd98341c60
+ ec5b980275202aedd4b0cf3b7ee1732c67c84db4b30b60b551cbf849222c60e1
+planchet₁ = 41f8a6622c99b6a9c30d52d19fc2c20a39a481219de4b0f3e7f604efed5d9625
+ 54ea13255785d10a037e14abd75d80a0aa9861df9d80a051c418ff197e68bd0e
+ ee61e6fd5d3214633734659e8bbd7dd2fe566bd41c537a5759bad9bbca6b2eb7
+ e3217e7d3cbefff192d83bd0527dbe0eff56df0b2e2062670d2873ca7766a7c1
+ 255e6fcf2c37e95de19fcad244f3986bab45c0a3aca726fc682455ea1166a238
+ 9152d7a67d181f035de6bdb97633888f0594c2f63dd3965134372507faf84f75
+ 3759abd662d4c7e8df7e01149ff44da3499ed49406d9398e86c4abf12a1f57f3
+ 8002115ef7283e4d5422b41c752a0cce8c2c1a9b84e109b4554fc1150ef578b9
+h_planchet₀ = 888da42dbf4897a5d6d9420b827e340c74c0b0e973e140ad1c7b9abfc400a9ec
+ 5a86b3185e4c656dbe8e01125604616de83fa28910fae513d016f56c3ca94eb4
+h_planchet₁ = f20015bbe0147313e59f9e64ee9e836c192b5d504dbd3328fcfce41fbe9310d6
+ aa96d91fdd77599c122cc5390ad7cb86d2c6d4261bd5950e7ec0f86959613841
+sig = 2ae0027dd4a196c4741d60e3e7ff933d7374fa5534d15f1cc2e96e9ab3392894
+ c65ab6a0af31ccdb395db5c526770077642502e27d4619d385a91dd13854e706
+~~~
+~~~ pseudocode
+(E1) coin issuance and signing (exchange)
+
+total = KUDOS:7.7
+blind_sig₀ = 139af4e7e7f6e9e0391e22f78cb0b2c334e6d6667633a192f56fde38ac9feec7
+ 841be59b2aa993084c50f70dfd9673dc723eec9d84c28ebd5f8104d1b0b29cf1
+ 18cd64cbe33925524a3363a1a6f24f59d47a404cf74680eee97cdeb8cc44a0b8
+ 4f3db4496d9bed1224c0fbda64d40f84ef5447d764fb714ca8e72a23a882e749
+ e47a519310f6d87b3e8ddc3e4ac4e541cdbfe7550c92f41c511b544d9fbdc2a7
+ 296b958e9df0b1394210aef4f1a780a129883d4bcb45425eef96204a7eaa9daa
+ 7d21827ecbf4571cefe6dbe65314e61c688175c1e81e01d4f0377c9c2312b6cc
+ 3487f2dd2cf8d85efde346f4d1a12de70bec4038b0bea0c505087c0e67ce4694
+blind_sig₁ = 89649cf83e2ba2cd75c7a1d01809c33d5d02fec81649256215f13a8965ad37d8
+ d47c264668ec187e46d75210ce601362fbb15f61a24ec1d337dd2589b5a4ee0e
+ 77a8d9734aca6a149b9f9b3a78c158b1f8cb243b8cbe9c2212290e8bc731d023
+ 82463f3e1cf0fc86c5472b8c96c5eaeac9c9064fdf7411f97935f27fd0bf8820
+ 0440c7cc3e6960c5c5156aedb5a820077be08f1ac4b00780258d7b843b21d7ba
+ f2d969d1b3c77a08b4fe14b216fe78c7e4c0ae964fc06bf3dfe7ff20ec85fa4d
+ 5e5aec24d89848645ffadb0de3da80c6e41b96571ef28e3d132b7c3fd16a289e
+ 32389cffb653b4744fabf882342f0db9aef110351d8ffd7a3b86701f0f5034c8
+~~~
+~~~ pseudocode
+(W3) coin unblinding (wallet)
+
+coin₀.sig = 9303650b8896b6619ca061f4bf44c1b02fb60784a2659de7512b599e7e6524ad
+ 5a283c81d289d3ec75fc81e7f336bd41dd67a41b72a98d9171f0461c188535b5
+ 55019079a18b4491903797f62a034e5f277ce8f7f3f56fbe47e44113561fd414
+ c841c2da97da1ae92df0e2cfbe3c26ad37f8bab9bd71365ac536204cda7c21dc
+ 39891b5cbb4e213f75d4e09c248a7a59f6322fd011619b29ec25ad621dfa2d6f
+ ae9f8b91935caf54d0d30f4a03bf6beed6637a4054efbad7a41f9da434f07cfd
+ 2f7619e8a3c82b30e079ff9fe13fc023fba7d627f4fb21e14467ce1db2776783
+ 1eb1c3ad5c39f61437a0a70c300fd84cd9280474bb507768a868ea92fa905428
+coin₁.sig = 355aa5b6bf10591375f22a014640cd242f470834759fab4421b4d237a149bc3e
+ 5fbc8f073e1348da770983cd36df9cf72a30bfe55776744b2d787acb06ba25cc
+ def36e5269771fe4a38a1109e8b96437a3cc625003f7fdf4d0cc879335584c5b
+ 13f2b29be1ea4d8a2da7826d608179d98b5edb11261e2048fbbba217a52ae862
+ d1e78e30c0787ee40908f1bca708c434d5412a262eca6bcd0ac5890bfbbe7df6
+ d69a5544d0054716dfda47791546c177223606c0645858a15b36887619a9d70a
+ 515f42897758bbe181765d7184cc92b5e2d743df1db9b30394b697117ad24811
+ 812febe0a3c57cbb5cf7f6857378f57cd1149f745ed95fd1d342e9860f516469
+~~~
+
+### Payment and Deposit {#tc1-payment}
+~~~ pseudocode
+(M1) order generation (merchant)
+
+wire_salt = 4c5249caea865380e0e519fc38177686
+order.id = ORDER-40
+order.price = KUDOS:7.42
+~~~
+~~~ pseudocode
+(W1) nonce generation (wallet)
+
+nonce.pub = 6729d69abd7d8218e02c953317b46bba2522efc2c19a7da63194e9ef40fcbd0d
+~~~
+~~~ pseudocode
+(M2) contract generation (merchant)
+
+h_wire = ec4e7258747a4de49628a27907b74f0aad097cfafaa595320f81786375430b67
+ ae1ada754299bbc0472f5a1e8bae6fe8e5dc52683dd09490ff06fb2fa4f20ec2
+timestamp = Sat Feb 14 13:37:42 2026
+pay_deadline = Sat Feb 14 14:07:42 2026
+refund_deadline = Sun Feb 15 13:37:42 2026
+wire_deadline = Mon Feb 16 13:37:42 2026
+contract = {
+ "version": 0,
+ "summary": "Free Software Support",
+ "order_id": "ORDER-40",
+ "products": [],
+ "timestamp": {
+ "t_s": 1771076262
+ },
+ "refund_deadline": {
+ "t_s": 1771162662
+ },
+ "pay_deadline": {
+ "t_s": 1771078062
+ },
+ "wire_transfer_deadline": {
+ "t_s": 1771249062
+ },
+ "merchant_pub": "YN6P8SGSE8ZQZ8PEF4K7JMZXV1JMSZ6GYB7W1HF8G3HY1M5B37R0",
+ "merchant_base_url": "https://merchant.taler.example.org/",
+ "merchant": {
+ "name": "Taler Merchant"
+ },
+ "h_wire": "XH774P3MF96Y95H8M9WGFDTF1APGJZ7TZAJSACGFG5W66XA31DKTW6PTEN19KEY08WQNM7MBNSQYHSEWA9M3VM4MJ3ZGDYSFMKS0XGG",
+ "wire_method": "XXXX",
+ "exchanges": [
+ {
+ "url": "https://exchange.taler.example.org/",
+ "priority": 1024,
+ "master_pub": "7JTYK0HXPASKBZDKYA2AX5GEATZ8P20WD0CVHC11FWWB15DM64XG"
+ }
+ ],
+ "nonce": "CWMXD6NXFP11HR1CJMSHFD3BQ8JJ5VY2R6D7V9HHJKMYYG7WQM6G",
+ "amount": "KUDOS:7.42",
+ "max_fee": "KUDOS:0.01"
+}
+h_contract = cc934a29efa612754edba0453d1b0ba175d6830d3ec2b2839a9a539d845a5da4
+ 622498e3819cb49206810688a93de1989c6542d2cf1d71f64dc998193e76d535
+sig = c249ee766b4dd256560d48b367d05a41cf7169306247ec56c51c39412b34c110
+ 15e365c2b2836761ba020b7175e60870572a6c7f780eeabb6f0777783064d602
+~~~
+~~~ pseudocode
+(W2) payment preparation (wallet)
+
+contribution₀ = KUDOS:5.12
+contribution₁ = KUDOS:2.3
+sig₀ = 8876dce4ca504df355f17c783e8327ea29b2cbcd7dde608b473644af3580621d
+ 3eb429022f6d1c4937328db478c6ed9784f6788e2e18dc16927efd4bc9c10908
+sig₁ = 031283a02cb413308cea4b69bd3d1b7beef87be7788fcfc1d7b83f8d97cd4ede
+ 218d0f753ba8fc92e22415a66065f5c1dff402368de8e85eca0c0ac7358e3602
+~~~
+~~~ pseudocode
+(M3) deposit preparation (merchant)
+
+~~~
+~~~ pseudocode
+(E1) deposit check (exchange)
+
+time_exchange = Sat Feb 14 13:37:44 2026
+sig = 09338dd4b1e692431290355b7df62d627a894718db68cf4a8e083bfed7b6c98a
+ 0dde3c5724f3cb3db0e6737f57c9eb35136997eaf403f27f82c0a9f1cf27d308
+~~~
+~~~ pseudocode
+(M2) deposit verification (merchant)
+
+sig = e66d503c843d72da4b6eb95f872396449de25cbf80b9c243d8c9ed2bde533d24
+ 60542c685bfdbf2eabc755510a60b97ed289711fd3f353cd80aa791e2e2f1e0d
+~~~