gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-grid5k] 118/189: add sharding logic


From: gnunet
Subject: [taler-grid5k] 118/189: add sharding logic
Date: Thu, 28 Apr 2022 10:48:08 +0200

This is an automated email from the git hooks/post-receive script.

marco-boss pushed a commit to branch master
in repository grid5k.

commit eab9f0b148f97d05c4eac4478762b5e2a3eb7cc7
Author: Boss Marco <bossm8@bfh.ch>
AuthorDate: Sat Apr 2 19:17:15 2022 +0200

    add sharding logic
---
 additional/README.md                          |    4 +
 additional/rspecs/taler.any.rspec             |  189 ++
 additional/rspecs/taler.minial.rspec          |   45 +
 additional/rspecs/taler.sharded.minimal.rspec |   73 +
 experiment/env                                |    2 +-
 experiment/scripts/database.sh                |   58 +-
 experiment/scripts/helpers.sh                 |   12 +-
 experiment/scripts/run.sh                     |    2 +-
 experiment/scripts/shard.sh                   |   26 +-
 experiment/taler.sharded.rspec                |  156 +-
 sql/exchange-0001.sql                         | 2540 -------------------------
 sql/exchange-tables.sql                       | 1139 -----------
 sql/partition-0001.sql                        |  601 ------
 sql/shard-0001.sql                            |   69 -
 14 files changed, 412 insertions(+), 4504 deletions(-)

diff --git a/additional/README.md b/additional/README.md
index 8507277..82f948c 100644
--- a/additional/README.md
+++ b/additional/README.md
@@ -67,3 +67,7 @@ and copy those ID one after another:
 * [Node Exporter Full](https://grafana.com/grafana/dashboards/1860): 1860
 * [Nginx Exporter](https://grafana.com/grafana/dashboards/12708): 12708
 
+## rspecs
+
+Contains various kinds of rpsec files which can be used with jFed. The main 
files
+can be found in `../experiment`.
diff --git a/additional/rspecs/taler.any.rspec 
b/additional/rspecs/taler.any.rspec
new file mode 100644
index 0000000..9dc9d48
--- /dev/null
+++ b/additional/rspecs/taler.any.rspec
@@ -0,0 +1,189 @@
+<?xml version='1.0'?>
+<rspec xmlns="http://www.geni.net/resources/rspec/3"; type="request" 
generated_by="jFed RSpec Editor" generated="2022-04-02T11:15:20.062+02:00" 
xmlns:emulab="http://www.protogeni.net/resources/rspec/ext/emulab/1"; 
xmlns:delay="http://www.protogeni.net/resources/rspec/ext/delay/1"; 
xmlns:jfed-command="http://jfed.iminds.be/rspec/ext/jfed-command/1"; 
xmlns:client="http://www.protogeni.net/resources/rspec/ext/client/1"; 
xmlns:jfed-ssh-keys="http://jfed.iminds.be/rspec/ext/jfed-ssh-keys/1"; xmlns: 
[...]
+  <node client_id="DB" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="163.0" 
y="140.5"/>
+  </node>
+  <node client_id="Exchange" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="275.0" 
y="195.5"/>
+  </node>
+  <node client_id="Bank" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="409.0" 
y="138.5"/>
+  </node>
+  <node client_id="Proxy" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="278.5" 
y="242.5"/>
+  </node>
+  <node client_id="Monitor" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="566.5" 
y="138.5"/>
+  </node>
+  <node client_id="Merchant" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="574.5" 
y="183.5"/>
+  </node>
+  <node client_id="DNS" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="558.0" 
y="94.5"/>
+  </node>
+  <node client_id="Wallet-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="140.0" 
y="300.0"/>
+  </node>
+  <node client_id="Wallet-2" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="280.0" 
y="300.0"/>
+  </node>
+  <node client_id="Wallet-3" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="420.0" 
y="300.0"/>
+  </node>
+  <node client_id="Wallet-4" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="560.0" 
y="300.0"/>
+  </node>
+  <node client_id="Wallet-5" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="700.0" 
y="300.0"/>
+  </node>
+  <node client_id="Wallet-6" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="140.0" 
y="340.0"/>
+  </node>
+  <node client_id="Wallet-7" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="280.0" 
y="340.0"/>
+  </node>
+  <node client_id="Wallet-8" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="420.0" 
y="340.0"/>
+  </node>
+  <node client_id="Wallet-9" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="560.0" 
y="340.0"/>
+  </node>
+  <node client_id="Wallet-10" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="700.0" 
y="340.0"/>
+  </node>
+  <node client_id="Wallet-11" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="140.0" 
y="380.0"/>
+  </node>
+  <node client_id="Wallet-12" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="280.0" 
y="380.0"/>
+  </node>
+  <node client_id="Wallet-13" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="420.0" 
y="380.0"/>
+  </node>
+  <node client_id="Wallet-14" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="560.0" 
y="380.0"/>
+  </node>
+  <node client_id="Wallet-15" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="700.0" 
y="380.0"/>
+  </node>
+  <node client_id="Wallet-16" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="140.0" 
y="420.0"/>
+  </node>
+  <node client_id="Wallet-17" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="280.0" 
y="420.0"/>
+  </node>
+  <node client_id="Wallet-18" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="420.0" 
y="420.0"/>
+  </node>
+  <node client_id="Wallet-19" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="560.0" 
y="420.0"/>
+  </node>
+  <node client_id="Wallet-20" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="700.0" 
y="420.0"/>
+  </node>
+  <node client_id="Shard-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="86.5" 
y="59.5"/>
+  </node>
+  <node client_id="Shard-2" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="246.5" 
y="59.5"/>
+  </node>
+  <node client_id="Shard-3" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="88.5" 
y="98.5"/>
+  </node>
+  <node client_id="Shard-4" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="248.5" 
y="100.5"/>
+  </node>
+</rspec>
\ No newline at end of file
diff --git a/additional/rspecs/taler.minial.rspec 
b/additional/rspecs/taler.minial.rspec
new file mode 100644
index 0000000..75eb12c
--- /dev/null
+++ b/additional/rspecs/taler.minial.rspec
@@ -0,0 +1,45 @@
+<?xml version='1.0'?>
+<rspec xmlns="http://www.geni.net/resources/rspec/3"; type="request" 
generated_by="jFed RSpec Editor" generated="2022-04-02T11:14:04.525+02:00" 
xmlns:emulab="http://www.protogeni.net/resources/rspec/ext/emulab/1"; 
xmlns:delay="http://www.protogeni.net/resources/rspec/ext/delay/1"; 
xmlns:jfed-command="http://jfed.iminds.be/rspec/ext/jfed-command/1"; 
xmlns:client="http://www.protogeni.net/resources/rspec/ext/client/1"; 
xmlns:jfed-ssh-keys="http://jfed.iminds.be/rspec/ext/jfed-ssh-keys/1"; xmlns: 
[...]
+  <node client_id="DB" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="166.0" 
y="102.5"/>
+  </node>
+  <node client_id="Exchange" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="220.0" 
y="159.5"/>
+  </node>
+  <node client_id="Bank" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="280.0" 
y="102.5"/>
+  </node>
+  <node client_id="Proxy" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="218.5" 
y="217.5"/>
+  </node>
+  <node client_id="Monitor" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="467.5" 
y="155.5"/>
+  </node>
+  <node client_id="DNS" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="458.0" 
y="109.5"/>
+  </node>
+</rspec>
\ No newline at end of file
diff --git a/additional/rspecs/taler.sharded.minimal.rspec 
b/additional/rspecs/taler.sharded.minimal.rspec
new file mode 100644
index 0000000..3a14872
--- /dev/null
+++ b/additional/rspecs/taler.sharded.minimal.rspec
@@ -0,0 +1,73 @@
+<?xml version='1.0'?>
+<rspec xmlns="http://www.geni.net/resources/rspec/3"; type="request" 
generated_by="jFed RSpec Editor" generated="2022-04-02T11:13:13.451+02:00" 
xmlns:emulab="http://www.protogeni.net/resources/rspec/ext/emulab/1"; 
xmlns:delay="http://www.protogeni.net/resources/rspec/ext/delay/1"; 
xmlns:jfed-command="http://jfed.iminds.be/rspec/ext/jfed-command/1"; 
xmlns:client="http://www.protogeni.net/resources/rspec/ext/client/1"; 
xmlns:jfed-ssh-keys="http://jfed.iminds.be/rspec/ext/jfed-ssh-keys/1"; xmlns: 
[...]
+  <node client_id="DB" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="184.0" 
y="122.5"/>
+  </node>
+  <node client_id="Exchange" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="248.0" 
y="177.5"/>
+  </node>
+  <node client_id="Bank" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="328.0" 
y="121.5"/>
+  </node>
+  <node client_id="Proxy" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="249.5" 
y="231.5"/>
+  </node>
+  <node client_id="Monitor" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="474.5" 
y="123.5"/>
+  </node>
+  <node client_id="DNS" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="466.0" 
y="77.5"/>
+  </node>
+  <node client_id="Shard-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="77.5" 
y="29.5"/>
+  </node>
+  <node client_id="Shard-2" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="224.5" 
y="27.5"/>
+  </node>
+  <node client_id="Shard-3" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="75.5" 
y="71.5"/>
+  </node>
+  <node client_id="Shard-4" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
+    <sliver_type name="raw-pc">
+      <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
+    </sliver_type>
+    <hardware_type name="dahu-grenoble"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="226.5" 
y="72.5"/>
+  </node>
+</rspec>
\ No newline at end of file
diff --git a/experiment/env b/experiment/env
index 299d010..bd354d7 100644
--- a/experiment/env
+++ b/experiment/env
@@ -32,7 +32,7 @@ EXCHANGE_DOMAIN=exchange.*.${DNS_ZONE}
 MERCHANT_DOMAIN=merchant.${DNS_ZONE}
  MONITOR_DOMAIN=monitor.${DNS_ZONE}
    PROXY_DOMAIN=proxy.${DNS_ZONE}
-   SHARD_DOMAIN=shard.*.${DNS_ZONE}
+   SHARD_DOMAIN=*.${DNS_ZONE}
 # Secondary domains only important for the node dashboards
          WALLET_DOMAIN=wallet.*.${DNS_ZONE}
 EXCH_AGGREGATOR_DOMAIN=exch-aggregator.${DNS_ZONE}
diff --git a/experiment/scripts/database.sh b/experiment/scripts/database.sh
index 70a61b3..bb46d14 100755
--- a/experiment/scripts/database.sh
+++ b/experiment/scripts/database.sh
@@ -241,57 +241,16 @@ function enable_remote_access() {
   fi
 }
 
-function setup_shards() {
+function configure_shard_access() {
 
-  cp ${G5K_HOME}/sql/exchange-tables.sql ${G5K_HOME}/sql/partition-0001.sql 
/tmp
-  chmod o+r /tmp/*.sql
-
-  su postgres << EOF
-psql -d "${DB_NAME}" -f /tmp/exchange-tables.sql
-EOF
-
-  cp ${G5K_HOME}/sql/exchange-0001.sql /usr/share/taler/sql/exchange/
-  
-  chmod o+r /usr/share/taler/sql/exchange/exchange-0001.sql
-
-  sudo -u taler-exchange-httpd taler-exchange-dbinit -r || true
-  sudo -u taler-exchange-httpd taler-exchange-dbinit -s || true
-  sudo -u taler-exchange-httpd taler-exchange-dbinit
-
-  su postgres << EOF
-psql -d "${DB_NAME}" -f /tmp/partition-0001.sql 
-psql -d "${DB_NAME}" -tAc "CREATE EXTENSION IF NOT EXISTS postgres_fdw;"
-EOF
-
-  su taler-exchange-httpd -s /bin/bash << EOF
-psql -d "${DB_NAME}" -tAc "SELECT master_prepare_sharding();"
-EOF
-
-  let "i=1"
-  for SHARD in $(get_shard_hosts); do
-    SUFFIX=$(echo $SHARD | cut -d "-" -f 2)
+  for i in $(seq $NUM_SHARDS); do
     su postgres << EOF
-psql -d "${DB_NAME}" -tAc "SELECT create_shard_server('${SUFFIX}',
-                                                      ${NUM_SHARDS},
-                                                      ${i},
-                                                      
'${SHARD_DOMAIN//\*/${SHARD}}',
-                                                      '${DB_USER}',
-                                                      '${DB_PASSWORD}',
-                                                      '${DB_NAME}',
-                                                     5432);"
-psql -d "${DB_NAME}" -tAc "GRANT ALL PRIVILEGES ON
-                           FOREIGN SERVER \"${SUFFIX}\"
-                           TO \"taler-exchange-httpd\";"
 psql -d "${DB_NAME}" -tAc "CREATE USER MAPPING IF NOT EXISTS FOR \"${DB_USER}\"
-                           SERVER \"${SUFFIX}\"
+                           SERVER \"${i}\"
                            OPTIONS (user '${DB_USER}', password 
'${DB_PASSWORD}');"
 EOF
-  let "i=i+1"
   done
 
-  su taler-exchange-httpd -s /bin/bash << EOF
-psql -d "${DB_NAME}" -tAc "SELECT drop_default_partitions();"
-EOF
 }
 
 # Initialize the database for taler exchange
@@ -319,16 +278,15 @@ psql postgres -tAc "SELECT 1 FROM pg_roles WHERE 
rolname='${DB_USER}'" | \
 END
 EOF
 
+  sudo -u taler-exchange-httpd taler-exchange-dbinit -r || true
+  sudo -u taler-exchange-httpd taler-exchange-dbinit -s || true
+
   if [ "${SHARD_DB}" = "true" ]; then
-    setup_shards
+    sudo -u postgres taler-exchange-dbinit -F ${NUM_SHARDS}
+    configure_shard_access
   elif [ "${PARTITION_DB}" = "true" ]; then
-    # TODO - move up if sharding is working too
-    sudo -u taler-exchange-httpd taler-exchange-dbinit -r || true
-    sudo -u taler-exchange-httpd taler-exchange-dbinit -s || true
     sudo -u taler-exchange-httpd taler-exchange-dbinit -P ${NUM_PARTITIONS}
   else
-    sudo -u taler-exchange-httpd taler-exchange-dbinit -r || true
-    sudo -u taler-exchange-httpd taler-exchange-dbinit -s || true
     sudo -u taler-exchange-httpd taler-exchange-dbinit
   fi
 
diff --git a/experiment/scripts/helpers.sh b/experiment/scripts/helpers.sh
index d606e66..b897c03 100755
--- a/experiment/scripts/helpers.sh
+++ b/experiment/scripts/helpers.sh
@@ -198,9 +198,9 @@ function stop_numbered_services() {
 }
 
 # Get all Grid5000 hosts which are registered under $1
-# Returns only the Grid5000 node - e.g. graoully-1
-# $1: the domain, containing a wildcard at position $2 e.g. x.*.y
-# $2: the location where the wildcard is
+# Returns the field which is specified in $2
+# $1: a regex for a domain/host to search for
+# $2: the location of the domain/host (split by .)
 function get_hosts() {
   IFS=$'\n' read -r -d '' -a HOSTS < <(\
     dig -t AXFR "${DNS_ZONE}" "@${DNS_HOSTS}" \
@@ -215,10 +215,10 @@ function get_wallet_hosts() {
   get_hosts "${WALLET_DOMAIN}" 2
 }
 
-# Get all Grid5000 hosts which host shards
-# Returns only the Grid5000 node - e.g. graoully-1
+# Get all shard hosts
+# returns the node name, e.g. shard-1
 function get_shard_hosts() {
-  get_hosts "${SHARD_DOMAIN}" 2
+  get_hosts "shard-" 1
 }
 
 # Get all Grid5000 hosts which host secondary exchanges
diff --git a/experiment/scripts/run.sh b/experiment/scripts/run.sh
index e8417c4..6273431 100644
--- a/experiment/scripts/run.sh
+++ b/experiment/scripts/run.sh
@@ -24,7 +24,7 @@ elif [[ "${HOSTNAME}" =~ ${DB_HOSTS} ]]; then
     exec ~/scripts/database.sh init
 elif [[ "${HOSTNAME}" =~ ${SHARD_HOSTS} ]]; then 
     set_host ${NODE_NAME}
-    set_ddn "${SHARD_DOMAIN//\*/${G5K_HOST}}"
+    set_ddn "${SHARD_DOMAIN//\*/${NODE_NAME}}"
     setup_log
     enable_logrotate
     exec ~/scripts/shard.sh init
diff --git a/experiment/scripts/shard.sh b/experiment/scripts/shard.sh
index ef62be9..4160c5d 100755
--- a/experiment/scripts/shard.sh
+++ b/experiment/scripts/shard.sh
@@ -133,6 +133,10 @@ function setup_config() {
 
 # Initialize the database for taler exchange shard
 function init_db() {
+
+  sed -i 
"s\<DB_URL_HERE>\postgresql://${DB_USER}:${DB_PASSWORD}@localhost:${DB_PORT}/${DB_NAME}\g"
 \
+       /etc/taler/secrets/exchange-db.secret.conf
+
   systemctl restart postgresql
 
   # Create the remote user "$DB_USER" and load pg_stat_statements for metrics
@@ -152,25 +156,9 @@ psql -tAc "SELECT 1 FROM pg_database WHERE 
datname='${DB_NAME}'" | \
   createdb -O "${DB_USER}" "${DB_NAME}"
 EOF
   
-  cp ${G5K_HOME}/sql/shard-0001.sql ${G5K_HOME}/sql/exchange-tables.sql /tmp
-  chmod o+r /tmp/*.sql
-
-  PGPASSWORD=${DB_PASSWORD} psql -tA \
-                                 -U ${DB_USER} \
-                                 -h localhost \
-                                 -d ${DB_NAME} \
-                                 -f /tmp/exchange-tables.sql
-  PGPASSWORD=${DB_PASSWORD} psql -tA \
-                                 -U ${DB_USER} \
-                                 -h localhost \
-                                 -d ${DB_NAME} \
-                                 -f /tmp/shard-0001.sql
-  PGPASSWORD=${DB_PASSWORD} psql -tA \
-                                 -U ${DB_USER} \
-                                 -h localhost \
-                                 -d ${DB_NAME} \
-                                 -c "SELECT setup_shard('$(hostname | cut -d 
"." -f 1 | cut -d "-" -f 2)');"
-  
+  IDX=$(echo $NODE_NAME | cut -d "-" -f 2)
+  sudo -u taler-exchange-httpd taler-exchange-dbinit -R ${IDX} || true
+  sudo -u taler-exchange-httpd taler-exchange-dbinit -S ${IDX}
 }
 
 case ${1} in 
diff --git a/experiment/taler.sharded.rspec b/experiment/taler.sharded.rspec
index 41961aa..8533362 100644
--- a/experiment/taler.sharded.rspec
+++ b/experiment/taler.sharded.rspec
@@ -1,481 +1,481 @@
 <?xml version='1.0'?>
-<rspec xmlns="http://www.geni.net/resources/rspec/3"; type="request" 
generated_by="jFed RSpec Editor" generated="2022-03-28T21:50:32.822+02:00" 
xmlns:emulab="http://www.protogeni.net/resources/rspec/ext/emulab/1"; 
xmlns:delay="http://www.protogeni.net/resources/rspec/ext/delay/1"; 
xmlns:jfed-command="http://jfed.iminds.be/rspec/ext/jfed-command/1"; 
xmlns:client="http://www.protogeni.net/resources/rspec/ext/client/1"; 
xmlns:jfed-ssh-keys="http://jfed.iminds.be/rspec/ext/jfed-ssh-keys/1"; xmlns: 
[...]
+<rspec xmlns="http://www.geni.net/resources/rspec/3"; type="request" 
generated_by="jFed RSpec Editor" generated="2022-04-02T11:19:43.414+02:00" 
xmlns:emulab="http://www.protogeni.net/resources/rspec/ext/emulab/1"; 
xmlns:delay="http://www.protogeni.net/resources/rspec/ext/delay/1"; 
xmlns:jfed-command="http://jfed.iminds.be/rspec/ext/jfed-command/1"; 
xmlns:client="http://www.protogeni.net/resources/rspec/ext/client/1"; 
xmlns:jfed-ssh-keys="http://jfed.iminds.be/rspec/ext/jfed-ssh-keys/1"; xmlns: 
[...]
   <node client_id="DB" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="97.68354430379748" y="25.0"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="139.0" 
y="108.5"/>
   </node>
   <node client_id="Exchange" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="221.0" 
y="72.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="224.69280280866005" y="153.94117647058823"/>
   </node>
   <node client_id="Bank" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="474.7974683544304" y="25.0"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="469.5236980690462" y="93.19004524886878"/>
   </node>
   <node client_id="Proxy" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="226.5" 
y="126.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="242.65593914569925" y="199.81447963800903"/>
   </node>
   <node client_id="Monitor" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="915.0" 
y="92.81119637333838"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1005.091281451141" y="90.710407239819"/>
   </node>
   <node client_id="Merchant" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="662.6455696202531" y="92.81119637333838"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="680.4242246928029" y="90.710407239819"/>
   </node>
   <node client_id="DNS" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="781.0253164556962" y="25.0"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="847.4148624926859" y="90.710407239819"/>
   </node>
   <node client_id="Aggregator" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="500.5" 
y="138.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="679.0936220011703" y="152.70135746606337"/>
   </node>
   <node client_id="Wirewatch" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="649.5" 
y="139.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="680.4242246928029" y="197.33484162895928"/>
   </node>
   <node client_id="Transfer" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="790.5" 
y="138.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="864.0473961380924" y="150.2217194570136"/>
   </node>
   <node client_id="Closer" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="913.5" 
y="137.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="861.3861907548273" y="196.09502262443436"/>
   </node>
   <node client_id="Exchange-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="364.0" 
y="70.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="421.622001170275" y="152.70135746606337"/>
   </node>
   <node client_id="Shard-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="1026.5" 
y="35.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="75.0" 
y="24.999999999999996"/>
   </node>
   <node client_id="Shard-2" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="1034.5" 
y="75.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="205.5" 
y="24.5"/>
   </node>
   <node client_id="Shard-3" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="1038.5" 
y="110.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="81.5" 
y="60.49999999999999"/>
   </node>
   <node client_id="Shard-4" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="1042.5" 
y="148.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="207.49999999999997" y="61.5"/>
   </node>
   <node client_id="Wallet-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="75.0" 
y="205.30722735107315"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="94.29373902867174" y="265.2858836841359"/>
   </node>
   <node client_id="Wallet-2" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="273.4810126582279" y="205.30722735107315"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="323.5893158059645" y="265.2858836841359"/>
   </node>
   <node client_id="Wallet-3" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="471.9620253164557" y="205.30722735107315"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="552.8848925832572" y="265.2858836841359"/>
   </node>
   <node client_id="Wallet-4" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="660.5" 
y="202.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="770.6937553580904" y="261.80542986425337"/>
   </node>
   <node client_id="Wallet-5" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="868.9240506329114" y="205.30722735107315"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1011.4760461378427" y="265.2858836841359"/>
   </node>
   <node client_id="Wallet-6" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="75.0" 
y="236.665006020825"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="94.29373902867174" y="304.1638536185794"/>
   </node>
   <node client_id="Wallet-7" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="273.4810126582279" y="236.665006020825"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="323.5893158059645" y="304.1638536185794"/>
   </node>
   <node client_id="Wallet-8" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="471.9620253164557" y="236.665006020825"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="552.8848925832572" y="304.1638536185794"/>
   </node>
   <node client_id="Wallet-9" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="670.4430379746834" y="236.665006020825"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="782.1804693605496" y="304.1638536185794"/>
   </node>
   <node client_id="Wallet-10" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="868.9240506329114" y="236.665006020825"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1011.4760461378427" y="304.1638536185794"/>
   </node>
   <node client_id="Wallet-11" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="75.0" 
y="268.0227846905768"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="94.29373902867174" y="343.0418235530229"/>
   </node>
   <node client_id="Wallet-12" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="273.4810126582279" y="268.0227846905768"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="323.5893158059645" y="343.0418235530229"/>
   </node>
   <node client_id="Wallet-13" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="471.9620253164557" y="268.0227846905768"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="552.8848925832572" y="343.0418235530229"/>
   </node>
   <node client_id="Wallet-14" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="670.4430379746834" y="268.0227846905768"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="782.1804693605496" y="343.0418235530229"/>
   </node>
   <node client_id="Wallet-15" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="868.9240506329114" y="268.0227846905768"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1011.4760461378427" y="343.0418235530229"/>
   </node>
   <node client_id="Wallet-16" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="75.0" 
y="299.3805633603287"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="94.29373902867174" y="381.9197934874664"/>
   </node>
   <node client_id="Wallet-17" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="273.4810126582279" y="299.3805633603287"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="323.5893158059645" y="381.9197934874664"/>
   </node>
   <node client_id="Wallet-18" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="471.9620253164557" y="299.3805633603287"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="552.8848925832572" y="381.9197934874664"/>
   </node>
   <node client_id="Wallet-19" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="670.4430379746834" y="299.3805633603287"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="782.1804693605496" y="381.9197934874664"/>
   </node>
   <node client_id="Wallet-20" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="868.9240506329114" y="299.3805633603287"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1011.4760461378427" y="381.9197934874664"/>
   </node>
   <node client_id="Wallet-21" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="80.67088607594937" y="333.4821476636838"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="100.84504122230867" y="424.19958579117355"/>
   </node>
   <node client_id="Wallet-22" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="279.15189873417717" y="333.4821476636838"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="330.1406179996014" y="424.19958579117355"/>
   </node>
   <node client_id="Wallet-23" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="477.63291139240505" y="334.26609213042764"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="559.4361947768941" y="425.17153503953466"/>
   </node>
   <node client_id="Wallet-24" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="677.5316455696203" y="333.4821476636838"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="790.3695971025962" y="424.19958579117355"/>
   </node>
   <node client_id="Wallet-25" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="876.012658227848" y="331.91425873019625"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1019.6651738798886" y="422.2556872944515"/>
   </node>
   <node client_id="Wallet-26" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="86.34177215189874" y="364.0559818666919"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="107.39634341594561" y="462.10560647725606"/>
   </node>
   <node client_id="Wallet-27" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="281.9873417721519" y="364.8399263334357"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="333.4162690964199" y="463.07755572561706"/>
   </node>
   <node client_id="Wallet-28" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="477.99999999999994" y="370.93658536585366"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="559.8602746063927" y="470.6363094581172"/>
   </node>
   <node client_id="Wallet-29" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="681.7848101265823" y="366.40781526692325"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="795.2830737478238" y="465.02145422233923"/>
   </node>
   <node client_id="Wallet-30" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="881.6835443037975" y="366.40781526692325"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1026.2164760735259" y="465.02145422233923"/>
   </node>
   <node client_id="Wallet-31" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="80.67088607594937" y="393.84587160295615"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="100.84504122230867" y="499.03967791497723"/>
   </node>
   <node client_id="Wallet-32" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="281.9873417721519" y="397.7655939366752"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="333.4162690964199" y="503.8994241567828"/>
   </node>
   <node client_id="Wallet-33" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="484.72151898734177" y="399.33348287016264"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="567.6253225189403" y="505.84332265350474"/>
   </node>
   <node client_id="Wallet-34" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="678.9493670886076" y="397.7655939366752"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="792.0074226510053" y="503.8994241567828"/>
   </node>
   <node client_id="Wallet-35" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="884.5189873417721" y="395.41376053644376"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1029.4921271703442" y="500.98357641169946"/>
   </node>
   <node client_id="Wallet-36" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="80.67088607594937" y="426.77153920619554"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="100.84504122230867" y="539.8615463461429"/>
   </node>
   <node client_id="Wallet-37" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="289.0759493670886" y="428.33942813968315"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="341.60539683846605" y="541.805444842865"/>
   </node>
   <node client_id="Wallet-38" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="488.97468354430373" y="429.90731707317076"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="572.5387991641679" y="543.7493433395873"/>
   </node>
   <node client_id="Wallet-39" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="688.873417721519" y="426.77153920619554"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="803.47220148987" y="539.8615463461429"/>
   </node>
   <node client_id="Wallet-40" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="891.6075949367088" y="427.55548367293943"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1037.6812549123902" y="540.833495594504"/>
   </node>
   <node client_id="Wallet-41" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="84.0" 
y="463.3365853658537"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="104.69100657259105" y="585.1955854762167"/>
   </node>
   <node client_id="Wallet-42" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="295.0" 
y="460.3317073170732"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="348.4491678800332" y="581.4700805650589"/>
   </node>
   <node client_id="Wallet-43" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="485.0" 
y="460.3317073170732"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="567.9470382516636" y="581.4700805650589"/>
   </node>
   <node client_id="Wallet-44" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="685.0" 
y="455.8243902439025"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="798.9974281165375" y="575.8818231983225"/>
   </node>
   <node client_id="Wallet-45" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="892.0" 
y="460.3317073170732"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1038.1345816266821" y="581.4700805650589"/>
   </node>
   <node client_id="Wallet-46" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="87.0" 
y="497.89268292682925"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="108.15676242056416" y="628.0388919545303"/>
   </node>
   <node client_id="Wallet-47" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="297.0" 
y="492.63414634146346"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="350.759671778682" y="621.5192583600044"/>
   </node>
   <node client_id="Wallet-48" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="491.0" 
y="496.390243902439"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="574.8785499476098" y="626.1761394989514"/>
   </node>
   <node client_id="Wallet-49" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="689.0" 
y="487.37560975609756"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="803.618435913835" y="614.9996247654783"/>
   </node>
   <node client_id="Wallet-50" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="897.0" 
y="492.63414634146346"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1043.910841373304" y="621.5192583600044"/>
   </node>
   <node client_id="Wallet-51" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="86.0" 
y="530.1951219512196"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="107.00151047123981" y="668.0880697494758"/>
   </node>
   <node client_id="Wallet-52" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="301.0" 
y="525.6878048780488"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="355.3806795759794" y="662.4998123827393"/>
   </node>
   <node client_id="Wallet-53" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="492.99999999999994" y="529.4439024390244"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="577.1890538462585" y="667.1566935216864"/>
   </node>
   <node client_id="Wallet-54" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="692.0" 
y="526.439024390244"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="807.0841917618081" y="663.4311886105287"/>
   </node>
   <node client_id="Wallet-55" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="901.9999999999999" y="529.4439024390244"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1049.6871011199257" y="667.1566935216864"/>
   </node>
   <node client_id="Wallet-56" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="90.0" 
y="558.7414634146342"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="111.62251826853728" y="703.480366405474"/>
   </node>
   <node client_id="Wallet-57" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="304.0" 
y="558.7414634146342"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="358.8464354239525" y="703.480366405474"/>
   </node>
   <node client_id="Wallet-58" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="494.0" 
y="560.2439024390244"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="578.3443057955828" y="705.3431188610527"/>
   </node>
   <node client_id="Wallet-59" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="696.0" 
y="557.2390243902439"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="811.7051995591056" y="701.6176139498951"/>
   </node>
   <node client_id="Wallet-60" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="904.9999999999999" y="564.0"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="1053.152856967899" y="710.0"/>
   </node>
   <node client_id="Proxy-1" exclusive="true" 
component_manager_id="urn:publicid:IDN+am.grid5000.fr+authority+am">
     <sliver_type name="raw-pc">
       <disk_image 
name="http://public.lille.grid5000.fr/~bfhch01/taler-debian11.dsc"/>
     </sliver_type>
     <hardware_type name="dahu-grenoble"/>
-    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; x="338.0" 
y="126.5"/>
+    <location xmlns="http://jfed.iminds.be/rspec/ext/jfed/1"; 
x="396.34055002925686" y="199.81447963800903"/>
   </node>
 </rspec>
\ No newline at end of file
diff --git a/sql/exchange-0001.sql b/sql/exchange-0001.sql
deleted file mode 100644
index eb5860a..0000000
--- a/sql/exchange-0001.sql
+++ /dev/null
@@ -1,2540 +0,0 @@
---
--- This file is part of TALER
--- Copyright (C) 2014--2022 Taler Systems SA
---
--- TALER is free software; you can redistribute it and/or modify it under the
--- terms of the GNU General Public License as published by the Free Software
--- Foundation; either version 3, or (at your option) any later version.
---
--- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
--- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
--- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
---
--- You should have received a copy of the GNU General Public License along with
--- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
---
-
--- Everything in one big transaction
-BEGIN;
-
--- Check patch versioning is in place.
-SELECT _v.register_patch('exchange-0001', NULL, NULL);
-
-CREATE TABLE IF NOT EXISTS denominations
-  (denominations_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,denom_pub_hash BYTEA PRIMARY KEY CHECK (LENGTH(denom_pub_hash)=64)
-  ,denom_type INT4 NOT NULL DEFAULT (1) -- 1 == RSA (for now, remove default 
later!)
-  ,age_mask INT4 NOT NULL DEFAULT (0)
-  ,denom_pub BYTEA NOT NULL
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  ,valid_from INT8 NOT NULL
-  ,expire_withdraw INT8 NOT NULL
-  ,expire_deposit INT8 NOT NULL
-  ,expire_legal INT8 NOT NULL
-  ,coin_val INT8 NOT NULL
-  ,coin_frac INT4 NOT NULL
-  ,fee_withdraw_val INT8 NOT NULL
-  ,fee_withdraw_frac INT4 NOT NULL
-  ,fee_deposit_val INT8 NOT NULL
-  ,fee_deposit_frac INT4 NOT NULL
-  ,fee_refresh_val INT8 NOT NULL
-  ,fee_refresh_frac INT4 NOT NULL
-  ,fee_refund_val INT8 NOT NULL
-  ,fee_refund_frac INT4 NOT NULL
-  );
-COMMENT ON TABLE denominations
-  IS 'Main denominations table. All the valid denominations the exchange knows 
about.';
-COMMENT ON COLUMN denominations.denom_type
-  IS 'determines cipher type for blind signatures used with this denomination; 
0 is for RSA';
-COMMENT ON COLUMN denominations.age_mask
-  IS 'bitmask with the age restrictions that are being used for this 
denomination; 0 if denomination does not support the use of age restrictions';
-COMMENT ON COLUMN denominations.denominations_serial
-  IS 'needed for exchange-auditor replication logic';
-
-CREATE INDEX IF NOT EXISTS denominations_by_expire_legal_index
-  ON denominations
-  (expire_legal);
-
-
-CREATE TABLE IF NOT EXISTS denomination_revocations
-  (denom_revocations_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,denominations_serial INT8 PRIMARY KEY REFERENCES denominations 
(denominations_serial) ON DELETE CASCADE
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  );
-COMMENT ON TABLE denomination_revocations
-  IS 'remembering which denomination keys have been revoked';
-
-
-SELECT create_table_wire_targets();
-
-COMMENT ON TABLE wire_targets
-  IS 'All senders and recipients of money via the exchange';
-COMMENT ON COLUMN wire_targets.payto_uri
-  IS 'Can be a regular bank account, or also be a URI identifying a 
reserve-account (for P2P payments)';
-COMMENT ON COLUMN wire_targets.wire_target_h_payto
-  IS 'Unsalted hash of payto_uri';
-COMMENT ON COLUMN wire_targets.kyc_ok
-  IS 'true if the KYC check was passed successfully';
-COMMENT ON COLUMN wire_targets.external_id
-  IS 'Name of the user that was used for OAuth 2.0-based legitimization';
-
-CREATE TABLE IF NOT EXISTS wire_targets_default
-  PARTITION OF wire_targets
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_wire_targets_partition('default');
-
-
-SELECT create_table_reserves();
-
-COMMENT ON TABLE reserves
-  IS 'Summarizes the balance of a reserve. Updated when new funds are added or 
withdrawn.';
-COMMENT ON COLUMN reserves.reserve_pub
-  IS 'EdDSA public key of the reserve. Knowledge of the private key implies 
ownership over the balance.';
-COMMENT ON COLUMN reserves.current_balance_val
-  IS 'Current balance remaining with the reserve';
-COMMENT ON COLUMN reserves.expiration_date
-  IS 'Used to trigger closing of reserves that have not been drained after 
some time';
-COMMENT ON COLUMN reserves.gc_date
-  IS 'Used to forget all information about a reserve during garbage 
collection';
-
-CREATE TABLE IF NOT EXISTS reserves_default
-  PARTITION OF reserves
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-
-
-SELECT create_table_reserves_in();
-
-COMMENT ON TABLE reserves_in
-  IS 'list of transfers of funds into the reserves, one per incoming wire 
transfer';
-COMMENT ON COLUMN reserves_in.wire_source_h_payto
-  IS 'Identifies the debited bank account and KYC status';
-COMMENT ON COLUMN reserves_in.reserve_pub
-  IS 'Public key of the reserve. Private key signifies ownership of the 
remaining balance.';
-COMMENT ON COLUMN reserves_in.credit_val
-  IS 'Amount that was transferred into the reserve';
-
-CREATE TABLE IF NOT EXISTS reserves_in_default
-  PARTITION OF reserves_in
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_reserves_in_partition('default');
-
-
-
-SELECT create_table_reserves_close();
-
-COMMENT ON TABLE reserves_close
-  IS 'wire transfers executed by the reserve to close reserves';
-COMMENT ON COLUMN reserves_close.wire_target_h_payto
-  IS 'Identifies the credited bank account (and KYC status). Note that closing 
does not depend on KYC.';
-
-CREATE INDEX IF NOT EXISTS reserves_close_by_close_uuid_index
-  ON reserves_close
-  (close_uuid);
-CREATE INDEX IF NOT EXISTS reserves_close_by_reserve_pub_index
-  ON reserves_close
-  (reserve_pub);
-
-CREATE TABLE IF NOT EXISTS reserves_close_default
-  PARTITION OF reserves_close
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_reserves_close_partition('default');
-
-
-SELECT create_table_reserves_out();
-
-COMMENT ON TABLE reserves_out
-  IS 'Withdraw operations performed on reserves.';
-COMMENT ON COLUMN reserves_out.h_blind_ev
-  IS 'Hash of the blinded coin, used as primary key here so that broken 
clients that use a non-random coin or blinding factor fail to withdraw 
(otherwise they would fail on deposit when the coin is not unique there).';
-COMMENT ON COLUMN reserves_out.denominations_serial
-  IS 'We do not CASCADE ON DELETE here, we may keep the denomination data 
alive';
-
-CREATE TABLE IF NOT EXISTS reserves_out_default
-  PARTITION OF reserves_out
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_reserves_out_partition('default');
-
-
-CREATE TABLE IF NOT EXISTS auditors
-  (auditor_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,auditor_pub BYTEA PRIMARY KEY CHECK (LENGTH(auditor_pub)=32)
-  ,auditor_name VARCHAR NOT NULL
-  ,auditor_url VARCHAR NOT NULL
-  ,is_active BOOLEAN NOT NULL
-  ,last_change INT8 NOT NULL
-  );
-COMMENT ON TABLE auditors
-  IS 'Table with auditors the exchange uses or has used in the past. Entries 
never expire as we need to remember the last_change column indefinitely.';
-COMMENT ON COLUMN auditors.auditor_pub
-  IS 'Public key of the auditor.';
-COMMENT ON COLUMN auditors.auditor_url
-  IS 'The base URL of the auditor.';
-COMMENT ON COLUMN auditors.is_active
-  IS 'true if we are currently supporting the use of this auditor.';
-COMMENT ON COLUMN auditors.last_change
-  IS 'Latest time when active status changed. Used to detect replays of old 
messages.';
-
-
-CREATE TABLE IF NOT EXISTS auditor_denom_sigs
-  (auditor_denom_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,auditor_uuid INT8 NOT NULL REFERENCES auditors (auditor_uuid) ON DELETE 
CASCADE
-  ,denominations_serial INT8 NOT NULL REFERENCES denominations 
(denominations_serial) ON DELETE CASCADE
-  ,auditor_sig BYTEA CHECK (LENGTH(auditor_sig)=64)
-  ,PRIMARY KEY (denominations_serial, auditor_uuid)
-  );
-COMMENT ON TABLE auditor_denom_sigs
-  IS 'Table with auditor signatures on exchange denomination keys.';
-COMMENT ON COLUMN auditor_denom_sigs.auditor_uuid
-  IS 'Identifies the auditor.';
-COMMENT ON COLUMN auditor_denom_sigs.denominations_serial
-  IS 'Denomination the signature is for.';
-COMMENT ON COLUMN auditor_denom_sigs.auditor_sig
-  IS 'Signature of the auditor, of purpose 
TALER_SIGNATURE_AUDITOR_EXCHANGE_KEYS.';
-
-
-CREATE TABLE IF NOT EXISTS exchange_sign_keys
-  (esk_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,exchange_pub BYTEA PRIMARY KEY CHECK (LENGTH(exchange_pub)=32)
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  ,valid_from INT8 NOT NULL
-  ,expire_sign INT8 NOT NULL
-  ,expire_legal INT8 NOT NULL
-  );
-COMMENT ON TABLE exchange_sign_keys
-  IS 'Table with master public key signatures on exchange online signing 
keys.';
-COMMENT ON COLUMN exchange_sign_keys.exchange_pub
-  IS 'Public online signing key of the exchange.';
-COMMENT ON COLUMN exchange_sign_keys.master_sig
-  IS 'Signature affirming the validity of the signing key of purpose 
TALER_SIGNATURE_MASTER_SIGNING_KEY_VALIDITY.';
-COMMENT ON COLUMN exchange_sign_keys.valid_from
-  IS 'Time when this online signing key will first be used to sign messages.';
-COMMENT ON COLUMN exchange_sign_keys.expire_sign
-  IS 'Time when this online signing key will no longer be used to sign.';
-COMMENT ON COLUMN exchange_sign_keys.expire_legal
-  IS 'Time when this online signing key legally expires.';
-
-
-CREATE TABLE IF NOT EXISTS signkey_revocations
-  (signkey_revocations_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,esk_serial INT8 PRIMARY KEY REFERENCES exchange_sign_keys (esk_serial) ON 
DELETE CASCADE
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  );
-COMMENT ON TABLE signkey_revocations
-  IS 'Table storing which online signing keys have been revoked';
-
-
-CREATE TABLE IF NOT EXISTS extensions
-  (extension_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,name VARCHAR NOT NULL UNIQUE
-  ,config BYTEA
-  );
-COMMENT ON TABLE extensions
-  IS 'Configurations of the activated extensions';
-COMMENT ON COLUMN extensions.name
-  IS 'Name of the extension';
-COMMENT ON COLUMN extensions.config
-  IS 'Configuration of the extension as JSON-blob, maybe NULL';
-
-
-SELECT create_table_known_coins();
-
-COMMENT ON TABLE known_coins
-  IS 'information about coins and their signatures, so we do not have to store 
the signatures more than once if a coin is involved in multiple operations';
-COMMENT ON COLUMN known_coins.denominations_serial
-  IS 'Denomination of the coin, determines the value of the original coin and 
applicable fees for coin-specific operations.';
-COMMENT ON COLUMN known_coins.coin_pub
-  IS 'EdDSA public key of the coin';
-COMMENT ON COLUMN known_coins.remaining_val
-  IS 'Value of the coin that remains to be spent';
-COMMENT ON COLUMN known_coins.age_commitment_hash
-  IS 'Optional hash of the age commitment for age restrictions as per DD 24 
(active if denom_type has the respective bit set)';
-COMMENT ON COLUMN known_coins.denom_sig
-  IS 'This is the signature of the exchange that affirms that the coin is a 
valid coin. The specific signature type depends on denom_type of the 
denomination.';
-
-CREATE TABLE IF NOT EXISTS known_coins_default
-  PARTITION OF known_coins
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_known_coins_partition('default');
-
-
-SELECT create_table_refresh_commitments();
-
-COMMENT ON TABLE refresh_commitments
-  IS 'Commitments made when melting coins and the gamma value chosen by the 
exchange.';
-COMMENT ON COLUMN refresh_commitments.noreveal_index
-  IS 'The gamma value chosen by the exchange in the cut-and-choose protocol';
-COMMENT ON COLUMN refresh_commitments.rc
-  IS 'Commitment made by the client, hash over the various client inputs in 
the cut-and-choose protocol';
-COMMENT ON COLUMN refresh_commitments.old_coin_pub
-  IS 'Coin being melted in the refresh process.';
-
-CREATE TABLE IF NOT EXISTS refresh_commitments_default
-  PARTITION OF refresh_commitments
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_refresh_commitments_partition('default');
-
-
-SELECT create_table_refresh_revealed_coins();
-
-COMMENT ON TABLE refresh_revealed_coins
-  IS 'Revelations about the new coins that are to be created during a melting 
session.';
-COMMENT ON COLUMN refresh_revealed_coins.rrc_serial
-  IS 'needed for exchange-auditor replication logic';
-COMMENT ON COLUMN refresh_revealed_coins.melt_serial_id
-  IS 'Identifies the refresh commitment (rc) of the melt operation.';
-COMMENT ON COLUMN refresh_revealed_coins.freshcoin_index
-  IS 'index of the fresh coin being created (one melt operation may result in 
multiple fresh coins)';
-COMMENT ON COLUMN refresh_revealed_coins.coin_ev
-  IS 'envelope of the new coin to be signed';
-COMMENT ON COLUMN refresh_revealed_coins.ewv
-  IS 'exchange contributed values in the creation of the fresh coin (see 
/csr)';
-COMMENT ON COLUMN refresh_revealed_coins.h_coin_ev
-  IS 'hash of the envelope of the new coin to be signed (for lookups)';
-COMMENT ON COLUMN refresh_revealed_coins.ev_sig
-  IS 'exchange signature over the envelope';
-
-CREATE TABLE IF NOT EXISTS refresh_revealed_coins_default
-  PARTITION OF refresh_revealed_coins
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_refresh_revealed_coins_partition('default');
-
-
-SELECT create_table_refresh_transfer_keys();
-
-COMMENT ON TABLE refresh_transfer_keys
-  IS 'Transfer keys of a refresh operation (the data revealed to the 
exchange).';
-COMMENT ON COLUMN refresh_transfer_keys.rtc_serial
-  IS 'needed for exchange-auditor replication logic';
-COMMENT ON COLUMN refresh_transfer_keys.melt_serial_id
-  IS 'Identifies the refresh commitment (rc) of the operation.';
-COMMENT ON COLUMN refresh_transfer_keys.transfer_pub
-  IS 'transfer public key for the gamma index';
-COMMENT ON COLUMN refresh_transfer_keys.transfer_privs
-  IS 'array of TALER_CNC_KAPPA - 1 transfer private keys that have been 
revealed, with the gamma entry being skipped';
-
-CREATE TABLE IF NOT EXISTS refresh_transfer_keys_default
-  PARTITION OF refresh_transfer_keys
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_refresh_transfer_keys_partition('default');
-
-
-CREATE TABLE IF NOT EXISTS extension_details
-  (extension_details_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY 
KEY
-  ,extension_options VARCHAR);
-COMMENT ON TABLE extension_details
-  IS 'Extensions that were provided with deposits (not yet used).';
-COMMENT ON COLUMN extension_details.extension_options
-  IS 'JSON object with options set that the exchange needs to consider when 
executing a deposit. Supported details depend on the extensions supported by 
the exchange.';
-
-
-SELECT create_table_deposits();
--- FIXME:
--- TODO: dynamically (!) creating/deleting partitions:
---    create new partitions 'as needed', drop old ones once the aggregator has 
made
---    them empty; as 'new' deposits will always have deadlines in the future, 
this
---    would basically guarantee no conflict between aggregator and exchange 
service!
--- SEE also: 
https://www.cybertec-postgresql.com/en/automatic-partition-creation-in-postgresql/
--- (article is slightly wrong, as this works:)
---CREATE TABLE tab (
---  id bigint GENERATED ALWAYS AS IDENTITY,
---  ts timestamp NOT NULL,
---  data text
--- PARTITION BY LIST ((ts::date));
--- CREATE TABLE tab_def PARTITION OF tab DEFAULT;
--- BEGIN
--- CREATE TABLE tab_part2 (LIKE tab);
--- insert into tab_part2 (id,ts, data) values (5,'2022-03-21', 'foo');
--- alter table tab attach partition tab_part2 for values in ('2022-03-21');
--- commit;
--- Naturally, to ensure this is actually 100% conflict-free, we'd
--- need to create tables at the granularity of the wire/refund deadlines;
--- that is right now seconds (!). But I see no problem with changing the
--- aggregator to basically always run 1 minute behind and use minutes instead!
-
-
-COMMENT ON TABLE deposits
-  IS 'Deposits we have received and for which we need to make (aggregate) wire 
transfers (and manage refunds).';
-COMMENT ON COLUMN deposits.shard
-  IS 'Used for load sharding. Should be set based on merchant_pub. 64-bit 
value because we need an *unsigned* 32-bit value.';
-COMMENT ON COLUMN deposits.known_coin_id
-  IS 'Used for garbage collection';
-COMMENT ON COLUMN deposits.wire_target_h_payto
-  IS 'Identifies the target bank account and KYC status';
-COMMENT ON COLUMN deposits.wire_salt
-  IS 'Salt used when hashing the payto://-URI to get the h_wire';
-COMMENT ON COLUMN deposits.done
-  IS 'Set to TRUE once we have included this deposit in some aggregate wire 
transfer to the merchant';
-COMMENT ON COLUMN deposits.extension_blocked
-  IS 'True if the aggregation of the deposit is currently blocked by some 
extension mechanism. Used to filter out deposits that must not be processed by 
the canonical deposit logic.';
-COMMENT ON COLUMN deposits.extension_details_serial_id
-  IS 'References extensions table, NULL if extensions are not used';
-COMMENT ON COLUMN deposits.tiny
-  IS 'Set to TRUE if we decided that the amount is too small to ever trigger a 
wire transfer by itself (requires real aggregation)';
-
-CREATE TABLE IF NOT EXISTS deposits_default
-  PARTITION OF deposits
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_deposits_partition('default');
-
-
-SELECT create_table_deposits_by_ready();
-
-COMMENT ON TABLE deposits_by_ready
-  IS 'Enables fast lookups for deposits_get_ready, auto-populated via TRIGGER 
below';
-
-CREATE TABLE IF NOT EXISTS deposits_by_ready_default
-  PARTITION OF deposits_by_ready
-  DEFAULT;
-
-
-SELECT create_table_deposits_for_matching();
-
-COMMENT ON TABLE deposits_for_matching
-  IS 'Enables fast lookups for deposits_iterate_matching, auto-populated via 
TRIGGER below';
-
-CREATE TABLE IF NOT EXISTS deposits_for_matching_default
-  PARTITION OF deposits_for_matching
-  DEFAULT;
-  
-
-CREATE OR REPLACE FUNCTION deposits_insert_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-DECLARE
-  is_ready BOOLEAN;
-DECLARE
-  is_tready BOOLEAN; -- is ready, but may be tiny
-BEGIN
-  is_ready  = NOT (NEW.done OR NEW.tiny OR NEW.extension_blocked);
-  is_tready = NOT (NEW.done OR NEW.extension_blocked);
-
-  IF (is_ready)
-  THEN
-    INSERT INTO deposits_by_ready
-      (wire_deadline
-      ,shard
-      ,coin_pub
-      ,deposit_serial_id)
-    VALUES
-      (NEW.wire_deadline
-      ,NEW.shard
-      ,NEW.coin_pub
-      ,NEW.deposit_serial_id);
-  END IF;
-  IF (is_tready)
-  THEN
-    INSERT INTO deposits_for_matching
-      (refund_deadline
-      ,shard
-      ,coin_pub
-      ,deposit_serial_id)
-    VALUES
-      (NEW.refund_deadline
-      ,NEW.shard
-      ,NEW.coin_pub
-      ,NEW.deposit_serial_id);
-  END IF;
-  RETURN NEW;
-END $$;  
-COMMENT ON FUNCTION deposits_insert_trigger()
-  IS 'Replicate deposit inserts into materialized indices.';
-
-CREATE TRIGGER deposits_on_insert
-  AFTER INSERT
-   ON deposits
-   FOR EACH ROW EXECUTE FUNCTION deposits_insert_trigger();
-
-CREATE OR REPLACE FUNCTION deposits_update_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-DECLARE
-  was_ready BOOLEAN;
-DECLARE
-  is_ready BOOLEAN;
-DECLARE
-  was_tready BOOLEAN; -- was ready, but may be tiny
-DECLARE
-  is_tready BOOLEAN; -- is ready, but may be tiny
-BEGIN
-  was_ready = NOT (OLD.done OR OLD.tiny OR OLD.extension_blocked);
-  is_ready  = NOT (NEW.done OR NEW.tiny OR NEW.extension_blocked);
-  was_tready = NOT (OLD.done OR OLD.extension_blocked);
-  is_tready  = NOT (NEW.done OR NEW.extension_blocked);
-  IF (was_ready AND NOT is_ready)
-  THEN
-    DELETE FROM deposits_by_ready
-     WHERE wire_deadline = OLD.wire_deadline
-       AND shard = OLD.shard
-       AND coin_pub = OLD.coin_pub
-       AND deposit_serial_id = OLD.deposit_serial_id;
-  END IF;
-  IF (was_tready AND NOT is_tready)
-  THEN
-    DELETE FROM deposits_for_matching
-     WHERE refund_deadline = OLD.refund_deadline
-       AND shard = OLD.shard
-       AND coin_pub = OLD.coin_pub
-       AND deposit_serial_id = OLD.deposit_serial_id;
-  END IF;
-  IF (is_ready AND NOT was_ready)
-  THEN
-    INSERT INTO deposits_by_ready
-      (wire_deadline
-      ,shard
-      ,coin_pub
-      ,deposit_serial_id)
-    VALUES
-      (NEW.wire_deadline
-      ,NEW.shard
-      ,NEW.coin_pub
-      ,NEW.deposit_serial_id);
-  END IF;
-  IF (is_tready AND NOT was_tready)
-  THEN
-    INSERT INTO deposits_for_matching
-      (refund_deadline
-      ,shard
-      ,coin_pub
-      ,deposit_serial_id)
-    VALUES
-      (NEW.refund_deadline
-      ,NEW.shard
-      ,NEW.coin_pub
-      ,NEW.deposit_serial_id);
-  END IF;
-  RETURN NEW;
-END $$;
-COMMENT ON FUNCTION deposits_update_trigger()
-  IS 'Replicate deposits changes into materialized indices.';
-
-CREATE TRIGGER deposits_on_update
-  AFTER UPDATE
-    ON deposits
-   FOR EACH ROW EXECUTE FUNCTION deposits_update_trigger();
-
-CREATE OR REPLACE FUNCTION deposits_delete_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-DECLARE
-  was_ready BOOLEAN;
-DECLARE
-  was_tready BOOLEAN; -- is ready, but may be tiny
-BEGIN
-  was_ready  = NOT (OLD.done OR OLD.tiny OR OLD.extension_blocked);
-  was_tready = NOT (OLD.done OR OLD.extension_blocked);
-
-  IF (was_ready)
-  THEN
-    DELETE FROM deposits_by_ready
-     WHERE wire_deadline = OLD.wire_deadline
-       AND shard = OLD.shard
-       AND coin_pub = OLD.coin_pub
-       AND deposit_serial_id = OLD.deposit_serial_id;
-  END IF;
-  IF (was_tready)
-  THEN
-    DELETE FROM deposits_for_matching
-     WHERE refund_deadline = OLD.refund_deadline
-       AND shard = OLD.shard
-       AND coin_pub = OLD.coin_pub
-       AND deposit_serial_id = OLD.deposit_serial_id;
-  END IF;
-  RETURN NEW;
-END $$;  
-COMMENT ON FUNCTION deposits_delete_trigger()
-  IS 'Replicate deposit deletions into materialized indices.';
-
-CREATE TRIGGER deposits_on_delete
-  AFTER DELETE
-   ON deposits
-   FOR EACH ROW EXECUTE FUNCTION deposits_delete_trigger();
-
-
-SELECT create_table_refunds();
-
-COMMENT ON TABLE refunds
-  IS 'Data on coins that were refunded. Technically, refunds always apply 
against specific deposit operations involving a coin. The combination of 
coin_pub, merchant_pub, h_contract_terms and rtransaction_id MUST be unique, 
and we usually select by coin_pub so that one goes first.';
-COMMENT ON COLUMN refunds.deposit_serial_id
-  IS 'Identifies ONLY the merchant_pub, h_contract_terms and coin_pub. 
Multiple deposits may match a refund, this only identifies one of them.';
-COMMENT ON COLUMN refunds.rtransaction_id
-  IS 'used by the merchant to make refunds unique in case the same coin for 
the same deposit gets a subsequent (higher) refund';
-
-CREATE TABLE IF NOT EXISTS refunds_default
-  PARTITION OF refunds
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_refunds_partition('default');
-
-
-SELECT create_table_wire_out();
-
-COMMENT ON TABLE wire_out
-  IS 'wire transfers the exchange has executed';
-COMMENT ON COLUMN wire_out.exchange_account_section
-  IS 'identifies the configuration section with the debit account of this 
payment';
-COMMENT ON COLUMN wire_out.wire_target_h_payto
-  IS 'Identifies the credited bank account and KYC status';
-
-CREATE TABLE IF NOT EXISTS wire_out_default
-  PARTITION OF wire_out
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_wire_out_partition('default');
-
-
-SELECT create_table_aggregation_tracking();
-
-COMMENT ON TABLE aggregation_tracking
-  IS 'mapping from wire transfer identifiers (WTID) to deposits (and back)';
-COMMENT ON COLUMN aggregation_tracking.wtid_raw
-  IS 'We first create entries in the aggregation_tracking table and then 
finally the wire_out entry once we know the total amount. Hence the constraint 
must be deferrable and we cannot use a wireout_uuid here, because we do not 
have it when these rows are created. Changing the logic to first INSERT a dummy 
row into wire_out and then UPDATEing that row in the same transaction would 
theoretically reduce per-deposit storage costs by 5 percent (24/~460 bytes).';
-
-CREATE TABLE IF NOT EXISTS aggregation_tracking_default
-  PARTITION OF aggregation_tracking
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_aggregation_tracking_partition('default');
-
-
-CREATE TABLE IF NOT EXISTS wire_fee
-  (wire_fee_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,wire_method VARCHAR NOT NULL
-  ,start_date INT8 NOT NULL
-  ,end_date INT8 NOT NULL
-  ,wire_fee_val INT8 NOT NULL
-  ,wire_fee_frac INT4 NOT NULL
-  ,closing_fee_val INT8 NOT NULL
-  ,closing_fee_frac INT4 NOT NULL
-  ,wad_fee_val INT8 NOT NULL
-  ,wad_fee_frac INT4 NOT NULL
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  ,PRIMARY KEY (wire_method, start_date)
-  );
-COMMENT ON TABLE wire_fee
-  IS 'list of the wire fees of this exchange, by date';
-COMMENT ON COLUMN wire_fee.wire_fee_serial
-  IS 'needed for exchange-auditor replication logic';
-
-CREATE INDEX IF NOT EXISTS wire_fee_by_end_date_index
-  ON wire_fee
-  (end_date);
-
-
-CREATE TABLE IF NOT EXISTS global_fee
-  (global_fee_serial BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,start_date INT8 NOT NULL
-  ,end_date INT8 NOT NULL
-  ,history_fee_val INT8 NOT NULL
-  ,history_fee_frac INT4 NOT NULL
-  ,kyc_fee_val INT8 NOT NULL
-  ,kyc_fee_frac INT4 NOT NULL
-  ,account_fee_val INT8 NOT NULL
-  ,account_fee_frac INT4 NOT NULL
-  ,purse_fee_val INT8 NOT NULL
-  ,purse_fee_frac INT4 NOT NULL
-  ,purse_timeout INT8 NOT NULL
-  ,kyc_timeout INT8 NOT NULL
-  ,history_expiration INT8 NOT NULL
-  ,purse_account_limit INT4 NOT NULL
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  ,PRIMARY KEY (start_date)
-  );
-COMMENT ON TABLE global_fee
-  IS 'list of the global fees of this exchange, by date';
-COMMENT ON COLUMN global_fee.global_fee_serial
-  IS 'needed for exchange-auditor replication logic';
-
-CREATE INDEX IF NOT EXISTS global_fee_by_end_date_index
-  ON global_fee
-  (end_date);
-
-
-SELECT create_table_recoup();
-
-COMMENT ON TABLE recoup
-  IS 'Information about recoups that were executed between a coin and a 
reserve. In this type of recoup, the amount is credited back to the reserve 
from which the coin originated.';
-COMMENT ON COLUMN recoup.coin_pub
-  IS 'Coin that is being debited in the recoup. Do not CASCADE ON DROP on the 
coin_pub, as we may keep the coin alive!';
-COMMENT ON COLUMN recoup.reserve_out_serial_id
-  IS 'Identifies the h_blind_ev of the recouped coin and provides the link to 
the credited reserve.';
-COMMENT ON COLUMN recoup.coin_sig
-  IS 'Signature by the coin affirming the recoup, of type 
TALER_SIGNATURE_WALLET_COIN_RECOUP';
-COMMENT ON COLUMN recoup.coin_blind
-  IS 'Denomination blinding key used when creating the blinded coin from the 
planchet. Secret revealed during the recoup to provide the linkage between the 
coin and the withdraw operation.';
-
-CREATE TABLE IF NOT EXISTS recoup_default
-  PARTITION OF recoup
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_recoup_partition('default');
-
-
-SELECT create_table_recoup_by_reserve();
-
-COMMENT ON TABLE recoup_by_reserve
-  IS 'Information in this table is strictly redundant with that of recoup, but 
saved by a different primary key for fast lookups by reserve_out_serial_id.';
-
-CREATE TABLE IF NOT EXISTS recoup_by_reserve_default
-  PARTITION OF recoup_by_reserve
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-CREATE OR REPLACE FUNCTION recoup_insert_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-BEGIN
-  INSERT INTO recoup_by_reserve
-    (reserve_out_serial_id
-    ,coin_pub)
-  VALUES
-    (NEW.reserve_out_serial_id
-    ,NEW.coin_pub);
-  RETURN NEW;
-END $$;  
-COMMENT ON FUNCTION recoup_insert_trigger()
-  IS 'Replicate recoup inserts into recoup_by_reserve table.';
-
-CREATE TRIGGER recoup_on_insert
-  AFTER INSERT
-   ON recoup
-   FOR EACH ROW EXECUTE FUNCTION recoup_insert_trigger();
-
-
-CREATE OR REPLACE FUNCTION recoup_delete_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-BEGIN
-  DELETE FROM recoup_by_reserve
-   WHERE reserve_out_serial_id = OLD.reserve_out_serial_id
-     AND coin_pub = OLD.coin_pub;
-  RETURN OLD;
-END $$;  
-COMMENT ON FUNCTION recoup_delete_trigger()
-  IS 'Replicate recoup deletions into recoup_by_reserve table.';
-
-CREATE TRIGGER recoup_on_delete
-  AFTER DELETE
-    ON recoup
-   FOR EACH ROW EXECUTE FUNCTION recoup_delete_trigger();
-
-
-
-SELECT create_table_reserves_out_by_reserve();
-
-COMMENT ON TABLE reserves_out_by_reserve
-  IS 'Information in this table is strictly redundant with that of 
reserves_out, but saved by a different primary key for fast lookups by reserve 
public key/uuid.';
-
-
-CREATE TABLE IF NOT EXISTS reserves_out_by_reserve_default
-  PARTITION OF reserves_out_by_reserve
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-CREATE OR REPLACE FUNCTION reserves_out_by_reserve_insert_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-BEGIN
-  INSERT INTO reserves_out_by_reserve
-    (reserve_uuid
-    ,h_blind_ev)
-  VALUES
-    (NEW.reserve_uuid
-    ,NEW.h_blind_ev);
-  RETURN NEW;
-END $$;  
-COMMENT ON FUNCTION reserves_out_by_reserve_insert_trigger()
-  IS 'Replicate reserve_out inserts into reserve_out_by_reserve table.';
-
-CREATE TRIGGER reserves_out_on_insert
-  AFTER INSERT
-   ON reserves_out
-   FOR EACH ROW EXECUTE FUNCTION reserves_out_by_reserve_insert_trigger();
-
-
-CREATE OR REPLACE FUNCTION reserves_out_by_reserve_delete_trigger()
-  RETURNS trigger
-  LANGUAGE plpgsql
-  AS $$
-BEGIN
-  DELETE FROM reserves_out_by_reserve
-   WHERE reserve_uuid = OLD.reserve_uuid;
-  RETURN OLD;
-END $$;  
-COMMENT ON FUNCTION reserves_out_by_reserve_delete_trigger()
-  IS 'Replicate reserve_out deletions into reserve_out_by_reserve table.';
-
-CREATE TRIGGER reserves_out_on_delete
-  AFTER DELETE
-    ON reserves_out
-   FOR EACH ROW EXECUTE FUNCTION reserves_out_by_reserve_delete_trigger();
-
-
-
-SELECT create_table_recoup_refresh();
-
-COMMENT ON TABLE recoup_refresh
-  IS 'Table of coins that originated from a refresh operation and that were 
recouped. Links the (fresh) coin to the melted operation (and thus the old 
coin). A recoup on a refreshed coin credits the old coin and debits the fresh 
coin.';
-COMMENT ON COLUMN recoup_refresh.coin_pub
-  IS 'Refreshed coin of a revoked denomination where the residual value is 
credited to the old coin. Do not CASCADE ON DROP on the coin_pub, as we may 
keep the coin alive!';
-COMMENT ON COLUMN recoup_refresh.known_coin_id
-  IS 'FIXME: (To be) used for garbage collection (in the future)';
-COMMENT ON COLUMN recoup_refresh.rrc_serial
-  IS 'Link to the refresh operation. Also identifies the h_blind_ev of the 
recouped coin (as h_coin_ev).';
-COMMENT ON COLUMN recoup_refresh.coin_blind
-  IS 'Denomination blinding key used when creating the blinded coin from the 
planchet. Secret revealed during the recoup to provide the linkage between the 
coin and the refresh operation.';
-
-CREATE TABLE IF NOT EXISTS recoup_refresh_default
-  PARTITION OF recoup_refresh
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_recoup_refresh_partition('default');
-
-
-SELECT create_table_prewire();
-
-COMMENT ON TABLE prewire
-  IS 'pre-commit data for wire transfers we are about to execute';
-COMMENT ON COLUMN prewire.failed
-  IS 'set to TRUE if the bank responded with a non-transient failure to our 
transfer request';
-COMMENT ON COLUMN prewire.finished
-  IS 'set to TRUE once bank confirmed receiving the wire transfer request';
-COMMENT ON COLUMN prewire.buf
-  IS 'serialized data to send to the bank to execute the wire transfer';
-
-CREATE TABLE IF NOT EXISTS prewire_default
-  PARTITION OF prewire
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-
-
-CREATE TABLE IF NOT EXISTS wire_accounts
-  (payto_uri VARCHAR PRIMARY KEY
-  ,master_sig BYTEA CHECK (LENGTH(master_sig)=64)
-  ,is_active BOOLEAN NOT NULL
-  ,last_change INT8 NOT NULL
-  );
-COMMENT ON TABLE wire_accounts
-  IS 'Table with current and historic bank accounts of the exchange. Entries 
never expire as we need to remember the last_change column indefinitely.';
-COMMENT ON COLUMN wire_accounts.payto_uri
-  IS 'payto URI (RFC 8905) with the bank account of the exchange.';
-COMMENT ON COLUMN wire_accounts.master_sig
-  IS 'Signature of purpose TALER_SIGNATURE_MASTER_WIRE_DETAILS';
-COMMENT ON COLUMN wire_accounts.is_active
-  IS 'true if we are currently supporting the use of this account.';
-COMMENT ON COLUMN wire_accounts.last_change
-  IS 'Latest time when active status changed. Used to detect replays of old 
messages.';
--- "wire_accounts" has no sequence because it is a 'mutable' table
---            and is of no concern to the auditor
-
-
-SELECT create_table_cs_nonce_locks();
-
-COMMENT ON TABLE cs_nonce_locks
-  IS 'ensures a Clause Schnorr client nonce is locked for use with an 
operation identified by a hash';
-COMMENT ON COLUMN cs_nonce_locks.nonce
-  IS 'actual nonce submitted by the client';
-COMMENT ON COLUMN cs_nonce_locks.op_hash
-  IS 'hash (RC for refresh, blind coin hash for withdraw) the nonce may be 
used with';
-COMMENT ON COLUMN cs_nonce_locks.max_denomination_serial
-  IS 'Maximum number of a CS denomination serial the nonce could be used with, 
for GC';
-
-CREATE TABLE IF NOT EXISTS cs_nonce_locks_default
-  PARTITION OF cs_nonce_locks
-  FOR VALUES WITH (MODULUS 1, REMAINDER 0);
-
-SELECT add_constraints_to_cs_nonce_locks_partition('default');
-
-
-CREATE TABLE IF NOT EXISTS work_shards
-  (shard_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,last_attempt INT8 NOT NULL
-  ,start_row INT8 NOT NULL
-  ,end_row INT8 NOT NULL
-  ,completed BOOLEAN NOT NULL DEFAULT FALSE
-  ,job_name VARCHAR NOT NULL
-  ,PRIMARY KEY (job_name, start_row)
-  );
-COMMENT ON TABLE work_shards
-  IS 'coordinates work between multiple processes working on the same job';
-COMMENT ON COLUMN work_shards.shard_serial_id
-  IS 'unique serial number identifying the shard';
-COMMENT ON COLUMN work_shards.last_attempt
-  IS 'last time a worker attempted to work on the shard';
-COMMENT ON COLUMN work_shards.completed
-  IS 'set to TRUE once the shard is finished by a worker';
-COMMENT ON COLUMN work_shards.start_row
-  IS 'row at which the shard scope starts, inclusive';
-COMMENT ON COLUMN work_shards.end_row
-  IS 'row at which the shard scope ends, exclusive';
-COMMENT ON COLUMN work_shards.job_name
-  IS 'unique name of the job the workers on this shard are performing';
-
-CREATE INDEX IF NOT EXISTS work_shards_by_job_name_completed_last_attempt_index
-  ON work_shards
-  (job_name
-  ,completed
-  ,last_attempt
-  );
-
-
-CREATE UNLOGGED TABLE IF NOT EXISTS revolving_work_shards
-  (shard_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY UNIQUE
-  ,last_attempt INT8 NOT NULL
-  ,start_row INT4 NOT NULL
-  ,end_row INT4 NOT NULL
-  ,active BOOLEAN NOT NULL DEFAULT FALSE
-  ,job_name VARCHAR NOT NULL
-  ,PRIMARY KEY (job_name, start_row)
-  );
-COMMENT ON TABLE revolving_work_shards
-  IS 'coordinates work between multiple processes working on the same job with 
partitions that need to be repeatedly processed; unlogged because on system 
crashes the locks represented by this table will have to be cleared anyway, 
typically using "taler-exchange-dbinit -s"';
-COMMENT ON COLUMN revolving_work_shards.shard_serial_id
-  IS 'unique serial number identifying the shard';
-COMMENT ON COLUMN revolving_work_shards.last_attempt
-  IS 'last time a worker attempted to work on the shard';
-COMMENT ON COLUMN revolving_work_shards.active
-  IS 'set to TRUE when a worker is active on the shard';
-COMMENT ON COLUMN revolving_work_shards.start_row
-  IS 'row at which the shard scope starts, inclusive';
-COMMENT ON COLUMN revolving_work_shards.end_row
-  IS 'row at which the shard scope ends, exclusive';
-COMMENT ON COLUMN revolving_work_shards.job_name
-  IS 'unique name of the job the workers on this shard are performing';
-
-CREATE INDEX IF NOT EXISTS 
revolving_work_shards_by_job_name_active_last_attempt_index
-  ON revolving_work_shards
-  (job_name
-  ,active
-  ,last_attempt
-  );
-
--- Tables for P2P payments
-
-CREATE TABLE IF NOT EXISTS partners
-  (partner_serial_id BIGSERIAL UNIQUE
-  ,partner_master_pub BYTEA NOT NULL CHECK(LENGTH(partner_master_pub)=32)
-  ,start_date INT8 NOT NULL
-  ,end_date INT8 NOT NULL
-  ,wad_frequency INT8 NOT NULL
-  ,wad_fee_val INT8 NOT NULL
-  ,wad_fee_frac INT4 NOT NULL
-  ,master_sig BYTEA NOT NULL CHECK (LENGTH(master_sig)=64)
-  ,partner_base_url TEXT NOT NULL
-  );
-COMMENT ON TABLE partners
-  IS 'exchanges we do wad transfers to';
-COMMENT ON COLUMN partners.partner_master_pub
-  IS 'offline master public key of the partner';
-COMMENT ON COLUMN partners.start_date
-  IS 'starting date of the partnership';
-COMMENT ON COLUMN partners.end_date
-  IS 'end date of the partnership';
-COMMENT ON COLUMN partners.wad_frequency
-  IS 'how often do we promise to do wad transfers';
-COMMENT ON COLUMN partners.wad_fee_val
-  IS 'how high is the fee for a wallet to be added to a wad to this partner';
-COMMENT ON COLUMN partners.partner_base_url
-  IS 'base URL of the REST API for this partner';
-COMMENT ON COLUMN partners.master_sig
-  IS 'signature of our master public key affirming the partnership, of purpose 
TALER_SIGNATURE_MASTER_PARTNER_DETAILS';
-
-
-CREATE TABLE IF NOT EXISTS purse_requests
-  (purse_deposit_serial_id BIGSERIAL UNIQUE
-  ,purse_pub BYTEA NOT NULL CHECK (LENGTH(purse_pub)=32)
-  ,merge_pub BYTEA NOT NULL CHECK (LENGTH(merge_pub)=32)
-  ,purse_expiration INT8 NOT NULL
-  ,h_contract_terms BYTEA NOT NULL CHECK (LENGTH(h_contract_terms)=64)
-  ,age_limit INT4 NOT NULL
-  ,amount_with_fee_val INT8 NOT NULL
-  ,amount_with_fee_frac INT4 NOT NULL
-  ,balance_val INT8 NOT NULL DEFAULT (0)
-  ,balance_frac INT4 NOT NULL DEFAULT (0)
-  ,purse_sig BYTEA NOT NULL CHECK(LENGTH(purse_sig)=64)
-  ,PRIMARY KEY (purse_pub)
-  ); -- partition by purse_pub
-COMMENT ON TABLE purse_requests
-  IS 'Requests establishing purses, associating them with a contract but 
without a target reserve';
-COMMENT ON COLUMN purse_requests.purse_pub
-  IS 'Public key of the purse';
-COMMENT ON COLUMN purse_requests.purse_expiration
-  IS 'When the purse is set to expire';
-COMMENT ON COLUMN purse_requests.h_contract_terms
-  IS 'Hash of the contract the parties are to agree to';
-COMMENT ON COLUMN purse_requests.amount_with_fee_val
-  IS 'Total amount expected to be in the purse';
-COMMENT ON COLUMN purse_requests.balance_val
-  IS 'Total amount actually in the purse';
-COMMENT ON COLUMN purse_requests.purse_sig
-  IS 'Signature of the purse affirming the purse parameters, of type 
TALER_SIGNATURE_PURSE_REQUEST';
-
--- FIXME: create purse_by_merge materialized index table
--- for merge_pub => purse_pub mapping!
-
-
-CREATE TABLE IF NOT EXISTS purse_merges
-  (purse_merge_request_serial_id BIGSERIAL -- UNIQUE
-  ,partner_serial_id INT8 REFERENCES partners(partner_serial_id) ON DELETE 
CASCADE
-  ,reserve_pub BYTEA NOT NULL CHECK(length(reserve_pub)=32)--REFERENCES 
reserves (reserve_pub) ON DELETE CASCADE
-  ,purse_pub BYTEA NOT NULL CHECK (LENGTH(purse_pub)=32) --REFERENCES 
purse_requests (purse_pub) ON DELETE CASCADE
-  ,merge_sig BYTEA NOT NULL CHECK (LENGTH(merge_sig)=64)
-  ,merge_timestamp INT8 NOT NULL
-  ,PRIMARY KEY (purse_pub)
-  ); -- partition by purse_pub; plus materialized index by reserve_pub!
-COMMENT ON TABLE purse_merges
-  IS 'Merge requests where a purse-owner requested merging the purse into the 
account';
-COMMENT ON COLUMN purse_merges.partner_serial_id
-  IS 'identifies the partner exchange, NULL in case the target reserve lives 
at this exchange';
-COMMENT ON COLUMN purse_merges.reserve_pub
-  IS 'public key of the target reserve';
-COMMENT ON COLUMN purse_merges.purse_pub
-  IS 'public key of the purse';
-COMMENT ON COLUMN purse_merges.merge_sig
-  IS 'signature by the purse private key affirming the merge, of type 
TALER_SIGNATURE_WALLET_PURSE_MERGE';
-COMMENT ON COLUMN purse_merges.merge_timestamp
-  IS 'when was the merge message signed';
-CREATE INDEX IF NOT EXISTS purse_merges_reserve_pub
-  ON purse_merges (reserve_pub);
-COMMENT ON INDEX purse_merges_reserve_pub
-  IS 'needed in reserve history computation';
-
-
-CREATE TABLE IF NOT EXISTS account_mergers
-  (account_merge_request_serial_id BIGSERIAL -- UNIQUE
-  ,reserve_pub BYTEA NOT NULL CHECK (LENGTH(reserve_pub)=32) -- REFERENCES 
reserves (reserve_pub) ON DELETE CASCADE
-  ,reserve_sig BYTEA NOT NULL CHECK (LENGTH(reserve_sig)=64)
-  ,purse_pub BYTEA NOT NULL CHECK (LENGTH(purse_pub)=32) -- REFERENCES 
purse_requests (purse_pub)
-  ,PRIMARY KEY (reserve_pub)
-  ); -- partition by purse_pub; plus materialized index by reserve_pub!
-COMMENT ON TABLE account_mergers
-  IS 'Merge requests where a purse- and account-owner requested merging the 
purse into the account';
-COMMENT ON COLUMN account_mergers.reserve_pub
-  IS 'public key of the target reserve';
-COMMENT ON COLUMN account_mergers.purse_pub
-  IS 'public key of the purse';
-COMMENT ON COLUMN account_mergers.reserve_sig
-  IS 'signature by the reserve private key affirming the merge, of type 
TALER_SIGNATURE_WALLET_ACCOUNT_MERGE';
-
-CREATE INDEX IF NOT EXISTS account_mergers_purse_pub
-  ON account_mergers (purse_pub);
-COMMENT ON INDEX account_mergers_purse_pub
-  IS 'needed when checking for a purse merge status';
-  
-
-CREATE TABLE IF NOT EXISTS contracts
-  (contract_serial_id BIGSERIAL UNIQUE
-  ,purse_pub BYTEA NOT NULL CHECK (LENGTH(purse_pub)=32)
-  ,pub_ckey BYTEA NOT NULL CHECK (LENGTH(pub_ckey)=32)
-  ,e_contract BYTEA NOT NULL
-  ,purse_expiration INT8 NOT NULL
-  ,PRIMARY KEY (purse_pub)
-  ); -- partition by purse_pub
-COMMENT ON TABLE contracts
-  IS 'encrypted contracts associated with purses';
-COMMENT ON COLUMN contracts.purse_pub
-  IS 'public key of the purse that the contract is associated with';
-COMMENT ON COLUMN contracts.pub_ckey
-  IS 'Public ECDH key used to encrypt the contract, to be used with the purse 
private key for decryption';
-COMMENT ON COLUMN contracts.e_contract
-  IS 'AES-GCM encrypted contract terms (contains gzip compressed JSON after 
decryption)';
-
-CREATE TABLE IF NOT EXISTS history_requests
-  (reserve_pub BYTEA NOT NULL CHECK (LENGTH(reserve_pub)=32) REFERENCES 
reserves(reserve_pub) ON DELETE CASCADE
-  ,request_timestamp INT8 NOT NULL
-  ,reserve_sig BYTEA NOT NULL CHECK (LENGTH(reserve_sig)=64)
-  ,history_fee_val INT8 NOT NULL
-  ,history_fee_frac INT4 NOT NULL
-  ,PRIMARY KEY (reserve_pub,request_timestamp)
-  ); -- partition by reserve_pub
-COMMENT ON TABLE history_requests
-  IS 'Paid history requests issued by a client against a reserve';
-COMMENT ON COLUMN history_requests.request_timestamp
-  IS 'When was the history request made';
-COMMENT ON COLUMN history_requests.reserve_sig
-  IS 'Signature approving payment for the history request';
-COMMENT ON COLUMN history_requests.history_fee_val
-  IS 'History fee approved by the signature';
-
-CREATE TABLE IF NOT EXISTS close_requests
-  (reserve_pub BYTEA NOT NULL CHECK (LENGTH(reserve_pub)=32) REFERENCES 
reserves(reserve_pub) ON DELETE CASCADE
-  ,close_timestamp INT8 NOT NULL
-  ,reserve_sig BYTEA NOT NULL CHECK (LENGTH(reserve_sig)=64)
-  ,close_val INT8 NOT NULL
-  ,close_frac INT4 NOT NULL
-  ,PRIMARY KEY (reserve_pub,close_timestamp)
-  ); -- partition by reserve_pub
-COMMENT ON TABLE close_requests
-  IS 'Explicit requests by a reserve owner to close a reserve immediately';
-COMMENT ON COLUMN close_requests.close_timestamp
-  IS 'When the request was created by the client';
-COMMENT ON COLUMN close_requests.reserve_sig
-  IS 'Signature affirming that the reserve is to be closed';
-COMMENT ON COLUMN close_requests.close_val
-  IS 'Balance of the reserve at the time of closing, to be wired to the 
associated bank account (minus the closing fee)';
-
-
-CREATE TABLE IF NOT EXISTS purse_deposits
-  (purse_deposit_serial_id BIGSERIAL UNIQUE
-  ,partner_serial_id INT8 REFERENCES partners(partner_serial_id) ON DELETE 
CASCADE
-  ,purse_pub BYTEA NOT NULL CHECK (LENGTH(purse_pub)=32)
-  ,coin_pub BYTEA NOT NULL REFERENCES known_coins (coin_pub) ON DELETE CASCADE
-  ,amount_with_fee_val INT8 NOT NULL
-  ,amount_with_fee_frac INT4 NOT NULL
-  ,coin_sig BYTEA NOT NULL CHECK(LENGTH(coin_sig)=64)
-  ,PRIMARY KEY (purse_pub,coin_pub)
-  ); -- partition by purse_pub, plus a materialized index by coin_pub!
-COMMENT ON TABLE purse_deposits
-  IS 'Requests depositing coins into a purse';
-COMMENT ON COLUMN purse_deposits.partner_serial_id
-  IS 'identifies the partner exchange, NULL in case the target purse lives at 
this exchange';
-COMMENT ON COLUMN purse_deposits.purse_pub
-  IS 'Public key of the purse';
-COMMENT ON COLUMN purse_deposits.coin_pub
-  IS 'Public key of the coin being deposited';
-COMMENT ON COLUMN purse_deposits.amount_with_fee_val
-  IS 'Total amount being deposited';
-COMMENT ON COLUMN purse_deposits.coin_sig
-  IS 'Signature of the coin affirming the deposit into the purse, of type 
TALER_SIGNATURE_PURSE_DEPOSIT';
-
-CREATE TABLE IF NOT EXISTS wads_out
-  (wad_out_serial_id BIGSERIAL UNIQUE
-  ,wad_id BYTEA PRIMARY KEY CHECK (LENGTH(wad_id)=24)
-  ,partner_serial_id INT8 NOT NULL REFERENCES partners(partner_serial_id) ON 
DELETE CASCADE
-  ,amount_val INT8 NOT NULL
-  ,amount_frac INT4 NOT NULL
-  ,execution_time INT8 NOT NULL
-  ); -- partition by wad_id
-COMMENT ON TABLE wads_out
-  IS 'Wire transfers made to another exchange to transfer purse funds';
-COMMENT ON COLUMN wads_out.wad_id
-  IS 'Unique identifier of the wad, part of the wire transfer subject';
-COMMENT ON COLUMN wads_out.partner_serial_id
-  IS 'target exchange of the wad';
-COMMENT ON COLUMN wads_out.amount_val
-  IS 'Amount that was wired';
-COMMENT ON COLUMN wads_out.execution_time
-  IS 'Time when the wire transfer was scheduled';
-
-CREATE TABLE IF NOT EXISTS wad_out_entries
-  (wad_out_entry_serial_id BIGSERIAL UNIQUE
-  ,wad_out_serial_id INT8 REFERENCES wads_out (wad_out_serial_id) ON DELETE 
CASCADE
-  ,reserve_pub BYTEA NOT NULL CHECK(LENGTH(reserve_pub)=32)
-  ,purse_pub BYTEA PRIMARY KEY CHECK(LENGTH(purse_pub)=32)
-  ,h_contract BYTEA NOT NULL CHECK(LENGTH(h_contract)=64)
-  ,purse_expiration INT8 NOT NULL
-  ,merge_timestamp INT8 NOT NULL
-  ,amount_with_fee_val INT8 NOT NULL
-  ,amount_with_fee_frac INT4 NOT NULL
-  ,wad_fee_val INT8 NOT NULL
-  ,wad_fee_frac INT4 NOT NULL
-  ,deposit_fees_val INT8 NOT NULL
-  ,deposit_fees_frac INT4 NOT NULL
-  ,reserve_sig BYTEA NOT NULL CHECK (LENGTH(reserve_sig)=64)
-  ,purse_sig BYTEA NOT NULL CHECK (LENGTH(purse_sig)=64)
-  ); -- partition by purse_pub? do we need a materialized index by reserve_pub?
-CREATE INDEX IF NOT EXISTS wad_out_entries_index_by_wad
-  ON wad_out_entries (wad_out_serial_id);
-COMMENT ON TABLE wad_out_entries
-  IS 'Purses combined into a wad';
-COMMENT ON COLUMN wad_out_entries.wad_out_serial_id
-  IS 'Wad the purse was part of';
-COMMENT ON COLUMN wad_out_entries.reserve_pub
-  IS 'Target reserve for the purse';
-COMMENT ON COLUMN wad_out_entries.purse_pub
-  IS 'Public key of the purse';
-COMMENT ON COLUMN wad_out_entries.h_contract
-  IS 'Hash of the contract associated with the purse';
-COMMENT ON COLUMN wad_out_entries.purse_expiration
-  IS 'Time when the purse expires';
-COMMENT ON COLUMN wad_out_entries.merge_timestamp
-  IS 'Time when the merge was approved';
-COMMENT ON COLUMN wad_out_entries.amount_with_fee_val
-  IS 'Total amount in the purse';
-COMMENT ON COLUMN wad_out_entries.wad_fee_val
-  IS 'Wat fee charged to the purse';
-COMMENT ON COLUMN wad_out_entries.deposit_fees_val
-  IS 'Total deposit fees charged to the purse';
-COMMENT ON COLUMN wad_out_entries.reserve_sig
-  IS 'Signature by the receiving reserve, of purpose 
TALER_SIGNATURE_ACCOUNT_MERGE';
-COMMENT ON COLUMN wad_out_entries.purse_sig
-  IS 'Signature by the purse of purpose TALER_SIGNATURE_PURSE_MERGE';
-
-CREATE TABLE IF NOT EXISTS wads_in
-  (wad_in_serial_id BIGSERIAL UNIQUE
-  ,wad_id BYTEA PRIMARY KEY CHECK (LENGTH(wad_id)=24)
-  ,origin_exchange_url TEXT NOT NULL
-  ,amount_val INT8 NOT NULL
-  ,amount_frac INT4 NOT NULL
-  ,arrival_time INT8 NOT NULL
-  ,UNIQUE (wad_id, origin_exchange_url)
-  ); -- partition by wad_id
-COMMENT ON TABLE wads_in
-  IS 'Incoming exchange-to-exchange wad wire transfers';
-COMMENT ON COLUMN wads_in.wad_id
-  IS 'Unique identifier of the wad, part of the wire transfer subject';
-COMMENT ON COLUMN wads_in.origin_exchange_url
-  IS 'Base URL of the originating URL, also part of the wire transfer subject';
-COMMENT ON COLUMN wads_in.amount_val
-  IS 'Actual amount that was received by our exchange';
-COMMENT ON COLUMN wads_in.arrival_time
-  IS 'Time when the wad was received';
-
-CREATE TABLE IF NOT EXISTS wad_in_entries
-  (wad_in_entry_serial_id BIGSERIAL UNIQUE
-  ,wad_in_serial_id INT8 REFERENCES wads_in (wad_in_serial_id) ON DELETE 
CASCADE
-  ,reserve_pub BYTEA NOT NULL CHECK(LENGTH(reserve_pub)=32)
-  ,purse_pub BYTEA PRIMARY KEY CHECK(LENGTH(purse_pub)=32)
-  ,h_contract BYTEA NOT NULL CHECK(LENGTH(h_contract)=64)
-  ,purse_expiration INT8 NOT NULL
-  ,merge_timestamp INT8 NOT NULL
-  ,amount_with_fee_val INT8 NOT NULL
-  ,amount_with_fee_frac INT4 NOT NULL
-  ,wad_fee_val INT8 NOT NULL
-  ,wad_fee_frac INT4 NOT NULL
-  ,deposit_fees_val INT8 NOT NULL
-  ,deposit_fees_frac INT4 NOT NULL
-  ,reserve_sig BYTEA NOT NULL CHECK (LENGTH(reserve_sig)=64)
-  ,purse_sig BYTEA NOT NULL CHECK (LENGTH(purse_sig)=64)
-  ); -- partition by purse or reserve? likely need both (so extra table?)
-COMMENT ON TABLE wad_in_entries
-  IS 'list of purses aggregated in a wad according to the sending exchange';
-COMMENT ON COLUMN wad_in_entries.wad_in_serial_id
-  IS 'wad for which the given purse was included in the aggregation';
-COMMENT ON COLUMN wad_in_entries.reserve_pub
-  IS 'target account of the purse (must be at the local exchange)';
-COMMENT ON COLUMN wad_in_entries.purse_pub
-  IS 'public key of the purse that was merged';
-COMMENT ON COLUMN wad_in_entries.h_contract
-  IS 'hash of the contract terms of the purse';
-COMMENT ON COLUMN wad_in_entries.purse_expiration
-  IS 'Time when the purse was set to expire';
-COMMENT ON COLUMN wad_in_entries.merge_timestamp
-  IS 'Time when the merge was approved';
-COMMENT ON COLUMN wad_in_entries.amount_with_fee_val
-  IS 'Total amount in the purse';
-COMMENT ON COLUMN wad_in_entries.wad_fee_val
-  IS 'Total wad fees paid by the purse';
-COMMENT ON COLUMN wad_in_entries.deposit_fees_val
-  IS 'Total deposit fees paid when depositing coins into the purse';
-COMMENT ON COLUMN wad_in_entries.reserve_sig
-  IS 'Signature by the receiving reserve, of purpose 
TALER_SIGNATURE_ACCOUNT_MERGE';
-COMMENT ON COLUMN wad_in_entries.purse_sig
-  IS 'Signature by the purse of purpose TALER_SIGNATURE_PURSE_MERGE';
-CREATE INDEX IF NOT EXISTS wad_in_entries_wad_in_serial
-  ON wad_in_entries (wad_in_serial_id);
-CREATE INDEX IF NOT EXISTS wad_in_entries_reserve_pub
-  ON wad_in_entries (reserve_pub);
-COMMENT ON INDEX wad_in_entries_wad_in_serial
-  IS 'needed to lookup all transfers associated with a wad';
-COMMENT ON INDEX wad_in_entries_reserve_pub
-  IS 'needed to compute reserve history';
-
-CREATE TABLE IF NOT EXISTS partner_accounts
-  (payto_uri VARCHAR PRIMARY KEY
-  ,partner_serial_id INT8 REFERENCES partners(partner_serial_id) ON DELETE 
CASCADE
-  ,partner_master_sig BYTEA CHECK (LENGTH(partner_master_sig)=64)
-  ,last_seen INT8 NOT NULL
-  );
-CREATE INDEX IF NOT EXISTS partner_accounts_index_by_partner_and_time
-  ON partner_accounts (partner_serial_id,last_seen);
-COMMENT ON TABLE partner_accounts
-  IS 'Table with bank accounts of the partner exchange. Entries never expire 
as we need to remember the signature for the auditor.';
-COMMENT ON COLUMN partner_accounts.payto_uri
-  IS 'payto URI (RFC 8905) with the bank account of the partner exchange.';
-COMMENT ON COLUMN partner_accounts.partner_master_sig
-  IS 'Signature of purpose TALER_SIGNATURE_MASTER_WIRE_DETAILS by the partner 
master public key';
-COMMENT ON COLUMN partner_accounts.last_seen
-  IS 'Last time we saw this account as being active at the partner exchange. 
Used to select the most recent entry, and to detect when we should check 
again.';
-
-
--- Stored procedures
-
-
-CREATE OR REPLACE FUNCTION exchange_do_withdraw(
-  IN cs_nonce BYTEA,
-  IN amount_val INT8,
-  IN amount_frac INT4,
-  IN h_denom_pub BYTEA,
-  IN rpub BYTEA,
-  IN reserve_sig BYTEA,
-  IN h_coin_envelope BYTEA,
-  IN denom_sig BYTEA,
-  IN now INT8,
-  IN min_reserve_gc INT8,
-  OUT reserve_found BOOLEAN,
-  OUT balance_ok BOOLEAN,
-  OUT kycok BOOLEAN,
-  OUT account_uuid INT8,
-  OUT ruuid INT8)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  reserve_gc INT8;
-DECLARE
-  denom_serial INT8;
-DECLARE
-  reserve_val INT8;
-DECLARE
-  reserve_frac INT4;
-BEGIN
--- Shards: reserves by reserve_pub (SELECT)
---         reserves_out (INSERT, with CONFLICT detection) by wih
---         reserves by reserve_pub (UPDATE)
---         reserves_in by reserve_pub (SELECT)
---         wire_targets by wire_target_h_payto
-
-SELECT denominations_serial
-  INTO denom_serial
-  FROM denominations
- WHERE denom_pub_hash=h_denom_pub;
-
-IF NOT FOUND
-THEN
-  -- denomination unknown, should be impossible!
-  reserve_found=FALSE;
-  balance_ok=FALSE;
-  kycok=FALSE;
-  account_uuid=0;
-  ruuid=0;
-  ASSERT false, 'denomination unknown';
-  RETURN;
-END IF;
-
-
-SELECT
-   current_balance_val
-  ,current_balance_frac
-  ,gc_date
-  ,reserve_uuid
- INTO
-   reserve_val
-  ,reserve_frac
-  ,reserve_gc
-  ,ruuid
-  FROM reserves
- WHERE reserves.reserve_pub=rpub;
-
-IF NOT FOUND
-THEN
-  -- reserve unknown
-  reserve_found=FALSE;
-  balance_ok=FALSE;
-  kycok=FALSE;
-  account_uuid=0;
-  ruuid=2;
-  RETURN;
-END IF;
-
--- We optimistically insert, and then on conflict declare
--- the query successful due to idempotency.
-INSERT INTO reserves_out
-  (h_blind_ev
-  ,denominations_serial
-  ,denom_sig
-  ,reserve_uuid
-  ,reserve_sig
-  ,execution_date
-  ,amount_with_fee_val
-  ,amount_with_fee_frac)
-VALUES
-  (h_coin_envelope
-  ,denom_serial
-  ,denom_sig
-  ,ruuid
-  ,reserve_sig
-  ,now
-  ,amount_val
-  ,amount_frac)
-ON CONFLICT DO NOTHING;
-
-IF NOT FOUND
-THEN
-  -- idempotent query, all constraints must be satisfied
-  reserve_found=TRUE;
-  balance_ok=TRUE;
-  kycok=TRUE;
-  account_uuid=0;
-  RETURN;
-END IF;
-
--- Check reserve balance is sufficient.
-IF (reserve_val > amount_val)
-THEN
-  IF (reserve_frac >= amount_frac)
-  THEN
-    reserve_val=reserve_val - amount_val;
-    reserve_frac=reserve_frac - amount_frac;
-  ELSE
-    reserve_val=reserve_val - amount_val - 1;
-    reserve_frac=reserve_frac + 100000000 - amount_frac;
-  END IF;
-ELSE
-  IF (reserve_val = amount_val) AND (reserve_frac >= amount_frac)
-  THEN
-    reserve_val=0;
-    reserve_frac=reserve_frac - amount_frac;
-  ELSE
-    reserve_found=TRUE;
-    balance_ok=FALSE;
-    kycok=FALSE; -- we do not really know or care
-    account_uuid=0;
-    RETURN;
-  END IF;
-END IF;
-
--- Calculate new expiration dates.
-min_reserve_gc=GREATEST(min_reserve_gc,reserve_gc);
-
--- Update reserve balance.
-UPDATE reserves SET
-  gc_date=min_reserve_gc
- ,current_balance_val=reserve_val
- ,current_balance_frac=reserve_frac
-WHERE
-  reserves.reserve_pub=rpub;
-
-reserve_found=TRUE;
-balance_ok=TRUE;
-
-
-
--- Special actions needed for a CS withdraw?
-IF NOT NULL cs_nonce
-THEN
-  -- Cache CS signature to prevent replays in the future
-  -- (and check if cached signature exists at the same time).
-  INSERT INTO cs_nonce_locks
-    (nonce
-    ,max_denomination_serial
-    ,op_hash)
-  VALUES
-    (cs_nonce
-    ,denom_serial
-    ,h_coin_envelope)
-  ON CONFLICT DO NOTHING;
-
-  IF NOT FOUND
-  THEN
-    -- See if the existing entry is identical.
-    SELECT 1
-      FROM cs_nonce_locks
-     WHERE nonce=cs_nonce
-       AND op_hash=h_coin_envelope;
-    IF NOT FOUND
-    THEN
-      reserve_found=FALSE;
-      balance_ok=FALSE;
-      kycok=FALSE;
-      account_uuid=0;
-      ruuid=1; -- FIXME: return error message more nicely!
-      ASSERT false, 'nonce reuse attempted by client';
-    END IF;
-  END IF;
-END IF;
-
-
-
--- Obtain KYC status based on the last wire transfer into
--- this reserve. FIXME: likely not adequate for reserves that got P2P 
transfers!
-SELECT
-   kyc_ok
-  ,wire_target_serial_id
-  INTO
-   kycok
-  ,account_uuid
-  FROM reserves_in
-  JOIN wire_targets ON (wire_source_h_payto = wire_target_h_payto)
- WHERE reserve_pub=rpub
- LIMIT 1; -- limit 1 should not be required (without p2p transfers)
-
-
-END $$;
-
-COMMENT ON FUNCTION exchange_do_withdraw(BYTEA, INT8, INT4, BYTEA, BYTEA, 
BYTEA, BYTEA, BYTEA, INT8, INT8)
-  IS 'Checks whether the reserve has sufficient balance for a withdraw 
operation (or the request is repeated and was previously approved) and if so 
updates the database with the result';
-
-
-
-CREATE OR REPLACE FUNCTION exchange_do_withdraw_limit_check(
-  IN ruuid INT8,
-  IN start_time INT8,
-  IN upper_limit_val INT8,
-  IN upper_limit_frac INT4,
-  OUT below_limit BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  total_val INT8;
-DECLARE
-  total_frac INT8; -- INT4 could overflow during accumulation!
-BEGIN
--- NOTE: Read-only, but crosses shards.
--- Shards: reserves by reserve_pub
---         reserves_out by reserve_uuid -- crosses shards!!
-
-
-SELECT
-   SUM(amount_with_fee_val) -- overflow here is not plausible
-  ,SUM(CAST(amount_with_fee_frac AS INT8)) -- compute using 64 bits
-  INTO
-   total_val
-  ,total_frac
-  FROM reserves_out
- WHERE reserve_uuid=ruuid
-   AND execution_date > start_time;
-
--- normalize result
-total_val = total_val + total_frac / 100000000;
-total_frac = total_frac % 100000000;
-
--- compare to threshold
-below_limit = (total_val < upper_limit_val) OR
-            ( (total_val = upper_limit_val) AND
-              (total_frac <= upper_limit_frac) );
-END $$;
-
-COMMENT ON FUNCTION exchange_do_withdraw_limit_check(INT8, INT8, INT8, INT4)
-  IS 'Check whether the withdrawals from the given reserve since the given 
time are below the given threshold';
-
-
--- NOTE: experiment, currently dead, see postgres_Start_deferred_wire_out;
--- now done inline. FIXME: Remove code here once inline version is confirmed 
working nicely!
-CREATE OR REPLACE PROCEDURE defer_wire_out()
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-IF EXISTS (
-  SELECT 1
-    FROM information_Schema.constraint_column_usage
-   WHERE table_name='wire_out'
-     AND constraint_name='wire_out_ref')
-THEN
-  SET CONSTRAINTS wire_out_ref DEFERRED;
-END IF;
-
-END $$;
-
-
-CREATE OR REPLACE FUNCTION exchange_do_deposit(
-  IN in_amount_with_fee_val INT8,
-  IN in_amount_with_fee_frac INT4,
-  IN in_h_contract_terms BYTEA,
-  IN in_wire_salt BYTEA,
-  IN in_wallet_timestamp INT8,
-  IN in_exchange_timestamp INT8,
-  IN in_refund_deadline INT8,
-  IN in_wire_deadline INT8,
-  IN in_merchant_pub BYTEA,
-  IN in_receiver_wire_account VARCHAR,
-  IN in_h_payto BYTEA,
-  IN in_known_coin_id INT8,
-  IN in_coin_pub BYTEA,
-  IN in_coin_sig BYTEA,
-  IN in_shard INT8,
-  IN in_extension_blocked BOOLEAN,
-  IN in_extension_details VARCHAR,
-  OUT out_exchange_timestamp INT8,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  wtsi INT8; -- wire target serial id
-DECLARE
-  xdi INT8; -- eXstension details serial id
-BEGIN
--- Shards: INSERT extension_details (by extension_details_serial_id)
---         INSERT wire_targets (by h_payto), on CONFLICT DO NOTHING;
---         INSERT deposits (by coin_pub, shard), ON CONFLICT DO NOTHING;
---         UPDATE known_coins (by coin_pub)
-
-IF NOT NULL in_extension_details
-THEN
-  INSERT INTO extension_details
-  (extension_options)
-  VALUES
-    (in_extension_details)
-  RETURNING extension_details_serial_id INTO xdi;
-ELSE
-  xdi=NULL;
-END IF;
-
-
-INSERT INTO wire_targets
-  (wire_target_h_payto
-  ,payto_uri)
-  VALUES
-  (in_h_payto
-  ,in_receiver_wire_account)
-ON CONFLICT DO NOTHING -- for CONFLICT ON (wire_target_h_payto)
-  RETURNING wire_target_serial_id INTO wtsi;
-
-IF NOT FOUND
-THEN
-  SELECT wire_target_serial_id
-  INTO wtsi
-  FROM wire_targets
-  WHERE wire_target_h_payto=in_h_payto;
-END IF;
-
-
-INSERT INTO deposits
-  (shard
-  ,coin_pub
-  ,known_coin_id
-  ,amount_with_fee_val
-  ,amount_with_fee_frac
-  ,wallet_timestamp
-  ,exchange_timestamp
-  ,refund_deadline
-  ,wire_deadline
-  ,merchant_pub
-  ,h_contract_terms
-  ,coin_sig
-  ,wire_salt
-  ,wire_target_h_payto
-  ,extension_blocked
-  ,extension_details_serial_id
-  )
-  VALUES
-  (in_shard
-  ,in_coin_pub
-  ,in_known_coin_id
-  ,in_amount_with_fee_val
-  ,in_amount_with_fee_frac
-  ,in_wallet_timestamp
-  ,in_exchange_timestamp
-  ,in_refund_deadline
-  ,in_wire_deadline
-  ,in_merchant_pub
-  ,in_h_contract_terms
-  ,in_coin_sig
-  ,in_wire_salt
-  ,in_h_payto
-  ,in_extension_blocked
-  ,xdi)
-  ON CONFLICT DO NOTHING;
-
-IF NOT FOUND
-THEN
-  -- Idempotency check: see if an identical record exists.
-  -- Note that by checking 'coin_sig', we implicitly check
-  -- identity over everything that the signature covers.
-  -- We do select over merchant_pub and wire_target_h_payto
-  -- primarily here to maximally use the existing index.
-  SELECT
-     exchange_timestamp
-   INTO
-     out_exchange_timestamp
-   FROM deposits
-   WHERE shard=in_shard
-     AND merchant_pub=in_merchant_pub
-     AND wire_target_h_payto=in_h_payto
-     AND coin_pub=in_coin_pub
-     AND coin_sig=in_coin_sig;
-
-  IF NOT FOUND
-  THEN
-    -- Deposit exists, but with differences. Not allowed.
-    out_balance_ok=FALSE;
-    out_conflict=TRUE;
-    RETURN;
-  END IF;
-
-  -- Idempotent request known, return success.
-  out_balance_ok=TRUE;
-  out_conflict=FALSE;
-
-  RETURN;
-END IF;
-
-
-out_exchange_timestamp=in_exchange_timestamp;
-
--- Check and update balance of the coin.
-UPDATE known_coins
-  SET
-    remaining_frac=remaining_frac-in_amount_with_fee_frac
-       + CASE
-         WHEN remaining_frac < in_amount_with_fee_frac
-         THEN 100000000
-         ELSE 0
-         END,
-    remaining_val=remaining_val-in_amount_with_fee_val
-       - CASE
-         WHEN remaining_frac < in_amount_with_fee_frac
-         THEN 1
-         ELSE 0
-         END
-  WHERE coin_pub=in_coin_pub
-    AND ( (remaining_val > in_amount_with_fee_val) OR
-          ( (remaining_frac >= in_amount_with_fee_frac) AND
-            (remaining_val >= in_amount_with_fee_val) ) );
-
-IF NOT FOUND
-THEN
-  -- Insufficient balance.
-  out_balance_ok=FALSE;
-  out_conflict=FALSE;
-  RETURN;
-END IF;
-
--- Everything fine, return success!
-out_balance_ok=TRUE;
-out_conflict=FALSE;
-
-END $$;
-
-
-
-CREATE OR REPLACE FUNCTION exchange_do_melt(
-  IN in_cs_rms BYTEA,
-  IN in_amount_with_fee_val INT8,
-  IN in_amount_with_fee_frac INT4,
-  IN in_rc BYTEA,
-  IN in_old_coin_pub BYTEA,
-  IN in_old_coin_sig BYTEA,
-  IN in_known_coin_id INT8, -- not used, but that's OK
-  IN in_noreveal_index INT4,
-  IN in_zombie_required BOOLEAN,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_zombie_bad BOOLEAN,
-  OUT out_noreveal_index INT4)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  denom_max INT8;
-BEGIN
--- Shards: INSERT refresh_commitments (by rc)
--- (rare:) SELECT refresh_commitments (by old_coin_pub) -- crosses shards!
--- (rare:) SEELCT refresh_revealed_coins (by melt_serial_id)
--- (rare:) PERFORM recoup_refresh (by rrc_serial) -- crosses shards!
---         UPDATE known_coins (by coin_pub)
-
-INSERT INTO refresh_commitments
-  (rc
-  ,old_coin_pub
-  ,old_coin_sig
-  ,amount_with_fee_val
-  ,amount_with_fee_frac
-  ,noreveal_index
-  )
-  VALUES
-  (in_rc
-  ,in_old_coin_pub
-  ,in_old_coin_sig
-  ,in_amount_with_fee_val
-  ,in_amount_with_fee_frac
-  ,in_noreveal_index)
-  ON CONFLICT DO NOTHING;
-
-IF NOT FOUND
-THEN
-  -- Idempotency check: see if an identical record exists.
-  out_noreveal_index=-1;
-  SELECT
-     noreveal_index
-    INTO
-     out_noreveal_index
-    FROM refresh_commitments
-   WHERE rc=in_rc;
-  out_balance_ok=FOUND;
-  out_zombie_bad=FALSE; -- zombie is OK
-  RETURN;
-END IF;
-
-
-IF in_zombie_required
-THEN
-  -- Check if this coin was part of a refresh
-  -- operation that was subsequently involved
-  -- in a recoup operation.  We begin by all
-  -- refresh operations our coin was involved
-  -- with, then find all associated reveal
-  -- operations, and then see if any of these
-  -- reveal operations was involved in a recoup.
-  PERFORM
-    FROM recoup_refresh
-   WHERE rrc_serial IN
-    (SELECT rrc_serial
-       FROM refresh_revealed_coins
-      WHERE melt_serial_id IN
-      (SELECT melt_serial_id
-         FROM refresh_commitments
-        WHERE old_coin_pub=in_old_coin_pub));
-  IF NOT FOUND
-  THEN
-    out_zombie_bad=TRUE;
-    out_balance_ok=FALSE;
-    RETURN;
-  END IF;
-END IF;
-
-out_zombie_bad=FALSE; -- zombie is OK
-
-
--- Check and update balance of the coin.
-UPDATE known_coins
-  SET
-    remaining_frac=remaining_frac-in_amount_with_fee_frac
-       + CASE
-         WHEN remaining_frac < in_amount_with_fee_frac
-         THEN 100000000
-         ELSE 0
-         END,
-    remaining_val=remaining_val-in_amount_with_fee_val
-       - CASE
-         WHEN remaining_frac < in_amount_with_fee_frac
-         THEN 1
-         ELSE 0
-         END
-  WHERE coin_pub=in_old_coin_pub
-    AND ( (remaining_val > in_amount_with_fee_val) OR
-          ( (remaining_frac >= in_amount_with_fee_frac) AND
-            (remaining_val >= in_amount_with_fee_val) ) );
-
-IF NOT FOUND
-THEN
-  -- Insufficient balance.
-  out_noreveal_index=-1;
-  out_balance_ok=FALSE;
-  RETURN;
-END IF;
-
-
-
--- Special actions needed for a CS melt?
-IF NOT NULL in_cs_rms
-THEN
-  -- Get maximum denominations serial value in
-  -- existence, this will determine how long the
-  -- nonce will be locked.
-  SELECT
-      denominations_serial
-    INTO
-      denom_max
-    FROM denominations
-      ORDER BY denominations_serial DESC
-      LIMIT 1;
-
-  -- Cache CS signature to prevent replays in the future
-  -- (and check if cached signature exists at the same time).
-  INSERT INTO cs_nonce_locks
-    (nonce
-    ,max_denomination_serial
-    ,op_hash)
-  VALUES
-    (cs_rms
-    ,denom_serial
-    ,in_rc)
-  ON CONFLICT DO NOTHING;
-
-  IF NOT FOUND
-  THEN
-    -- Record exists, make sure it is the same
-    SELECT 1
-      FROM cs_nonce_locks
-     WHERE nonce=cs_rms
-       AND op_hash=in_rc;
-
-    IF NOT FOUND
-    THEN
-       -- Nonce reuse detected
-       out_balance_ok=FALSE;
-       out_zombie_bad=FALSE;
-       out_noreveal_index=42; -- FIXME: return error message more nicely!
-       ASSERT false, 'nonce reuse attempted by client';
-    END IF;
-  END IF;
-END IF;
-
-
-
-
--- Everything fine, return success!
-out_balance_ok=TRUE;
-out_noreveal_index=in_noreveal_index;
-
-END $$;
-
-
-
-CREATE OR REPLACE FUNCTION exchange_do_refund(
-  IN in_amount_with_fee_val INT8,
-  IN in_amount_with_fee_frac INT4,
-  IN in_amount_val INT8,
-  IN in_amount_frac INT4,
-  IN in_deposit_fee_val INT8,
-  IN in_deposit_fee_frac INT4,
-  IN in_h_contract_terms BYTEA,
-  IN in_rtransaction_id INT8,
-  IN in_deposit_shard INT8,
-  IN in_known_coin_id INT8,
-  IN in_coin_pub BYTEA,
-  IN in_merchant_pub BYTEA,
-  IN in_merchant_sig BYTEA,
-  OUT out_not_found BOOLEAN,
-  OUT out_refund_ok BOOLEAN,
-  OUT out_gone BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  dsi INT8; -- ID of deposit being refunded
-DECLARE
-  tmp_val INT8; -- total amount refunded
-DECLARE
-  tmp_frac INT8; -- total amount refunded
-DECLARE
-  deposit_val INT8; -- amount that was originally deposited
-DECLARE
-  deposit_frac INT8; -- amount that was originally deposited
-BEGIN
--- Shards: SELECT deposits (coin_pub, shard, h_contract_terms, merchant_pub)
---         INSERT refunds (by deposit_serial_id, rtransaction_id) ON CONFLICT 
DO NOTHING
---         SELECT refunds (by deposit_serial_id)
---         UPDATE known_coins (by coin_pub)
-
-SELECT
-   deposit_serial_id
-  ,amount_with_fee_val
-  ,amount_with_fee_frac
-  ,done
-INTO
-   dsi
-  ,deposit_val
-  ,deposit_frac
-  ,out_gone
-FROM deposits
- WHERE coin_pub=in_coin_pub
-  AND shard=in_deposit_shard
-  AND merchant_pub=in_merchant_pub
-  AND h_contract_terms=in_h_contract_terms;
-
-IF NOT FOUND
-THEN
-  -- No matching deposit found!
-  out_refund_ok=FALSE;
-  out_conflict=FALSE;
-  out_not_found=TRUE;
-  out_gone=FALSE;
-  RETURN;
-END IF;
-
-
-INSERT INTO refunds
-  (deposit_serial_id
-  ,shard
-  ,merchant_sig
-  ,rtransaction_id
-  ,amount_with_fee_val
-  ,amount_with_fee_frac
-  )
-  VALUES
-  (dsi
-  ,in_deposit_shard
-  ,in_merchant_sig
-  ,in_rtransaction_id
-  ,in_amount_with_fee_val
-  ,in_amount_with_fee_frac)
-  ON CONFLICT DO NOTHING;
-
-IF NOT FOUND
-THEN
-  -- Idempotency check: see if an identical record exists.
-  -- Note that by checking 'coin_sig', we implicitly check
-  -- identity over everything that the signature covers.
-  -- We do select over merchant_pub and h_contract_terms
-  -- primarily here to maximally use the existing index.
-   PERFORM
-   FROM refunds
-   WHERE shard=in_deposit_shard
-     AND deposit_serial_id=dsi
-     AND rtransaction_id=in_rtransaction_id
-     AND amount_with_fee_val=in_amount_with_fee_val
-     AND amount_with_fee_frac=in_amount_with_fee_frac;
-
-  IF NOT FOUND
-  THEN
-    -- Deposit exists, but have conflicting refund.
-    out_refund_ok=FALSE;
-    out_conflict=TRUE;
-    out_not_found=FALSE;
-    RETURN;
-  END IF;
-
-  -- Idempotent request known, return success.
-  out_refund_ok=TRUE;
-  out_conflict=FALSE;
-  out_not_found=FALSE;
-  out_gone=FALSE;
-  RETURN;
-END IF;
-
-
-IF out_gone
-THEN
-  -- money already sent to the merchant. Tough luck.
-  out_refund_ok=FALSE;
-  out_conflict=FALSE;
-  out_not_found=FALSE;
-  RETURN;
-END IF;
-
-
-
--- Check refund balance invariant.
-SELECT
-   SUM(amount_with_fee_val) -- overflow here is not plausible
-  ,SUM(CAST(amount_with_fee_frac AS INT8)) -- compute using 64 bits
-  INTO
-   tmp_val
-  ,tmp_frac
-  FROM refunds
-  WHERE shard=in_deposit_shard
-    AND deposit_serial_id=dsi;
-IF tmp_val IS NULL
-THEN
-  RAISE NOTICE 'failed to sum up existing refunds';
-  out_refund_ok=FALSE;
-  out_conflict=FALSE;
-  out_not_found=FALSE;
-  RETURN;
-END IF;
-
--- Normalize result before continuing
-tmp_val = tmp_val + tmp_frac / 100000000;
-tmp_frac = tmp_frac % 100000000;
-
--- Actually check if the deposits are sufficient for the refund. Verbosely. ;-)
-IF (tmp_val < deposit_val)
-THEN
-  out_refund_ok=TRUE;
-ELSE
-  IF (tmp_val = deposit_val) AND (tmp_frac <= deposit_frac)
-  THEN
-    out_refund_ok=TRUE;
-  ELSE
-    out_refund_ok=FALSE;
-  END IF;
-END IF;
-
-IF (tmp_val = deposit_val) AND (tmp_frac = deposit_frac)
-THEN
-  -- Refunds have reached the full value of the original
-  -- deposit. Also refund the deposit fee.
-  in_amount_frac = in_amount_frac + in_deposit_fee_frac;
-  in_amount_val = in_amount_val + in_deposit_fee_val;
-
-  -- Normalize result before continuing
-  in_amount_val = in_amount_val + in_amount_frac / 100000000;
-  in_amount_frac = in_amount_frac % 100000000;
-END IF;
-
--- Update balance of the coin.
-UPDATE known_coins
-  SET
-    remaining_frac=remaining_frac+in_amount_frac
-       - CASE
-         WHEN remaining_frac+in_amount_frac >= 100000000
-         THEN 100000000
-         ELSE 0
-         END,
-    remaining_val=remaining_val+in_amount_val
-       + CASE
-         WHEN remaining_frac+in_amount_frac >= 100000000
-         THEN 1
-         ELSE 0
-         END
-  WHERE coin_pub=in_coin_pub;
-
-
-out_conflict=FALSE;
-out_not_found=FALSE;
-
-END $$;
-
--- COMMENT ON FUNCTION exchange_do_refund(INT8, INT4, BYTEA, BOOLEAN, BOOLEAN)
---  IS 'Executes a refund operation, checking that the corresponding deposit 
was sufficient to cover the refunded amount';
-
-
-CREATE OR REPLACE FUNCTION exchange_do_recoup_to_reserve(
-  IN in_reserve_pub BYTEA,
-  IN in_reserve_out_serial_id INT8,
-  IN in_coin_blind BYTEA,
-  IN in_coin_pub BYTEA,
-  IN in_known_coin_id INT8,
-  IN in_coin_sig BYTEA,
-  IN in_reserve_gc INT8,
-  IN in_reserve_expiration INT8,
-  IN in_recoup_timestamp INT8,
-  OUT out_recoup_ok BOOLEAN,
-  OUT out_internal_failure BOOLEAN,
-  OUT out_recoup_timestamp INT8)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  tmp_val INT8; -- amount recouped
-DECLARE
-  tmp_frac INT8; -- amount recouped
-BEGIN
--- Shards: SELECT known_coins (by coin_pub)
---         SELECT recoup      (by coin_pub)
---         UPDATE known_coins (by coin_pub)
---         UPDATE reserves (by reserve_pub)
---         INSERT recoup      (by coin_pub)
-
-out_internal_failure=FALSE;
-
-
--- Check remaining balance of the coin.
-SELECT
-   remaining_frac
-  ,remaining_val
- INTO
-   tmp_frac
-  ,tmp_val
-FROM known_coins
-  WHERE coin_pub=in_coin_pub;
-
-IF NOT FOUND
-THEN
-  out_internal_failure=TRUE;
-  out_recoup_ok=FALSE;
-  RETURN;
-END IF;
-
-IF tmp_val + tmp_frac = 0
-THEN
-  -- Check for idempotency
-  SELECT
-    recoup_timestamp
-  INTO
-    out_recoup_timestamp
-    FROM recoup
-    WHERE coin_pub=in_coin_pub;
-
-  out_recoup_ok=FOUND;
-  RETURN;
-END IF;
-
-
--- Update balance of the coin.
-UPDATE known_coins
-  SET
-     remaining_frac=0
-    ,remaining_val=0
-  WHERE coin_pub=in_coin_pub;
-
-
--- Credit the reserve and update reserve timers.
-UPDATE reserves
-  SET
-    current_balance_frac=current_balance_frac+tmp_frac
-       - CASE
-         WHEN current_balance_frac+tmp_frac >= 100000000
-         THEN 100000000
-         ELSE 0
-         END,
-    current_balance_val=current_balance_val+tmp_val
-       + CASE
-         WHEN current_balance_frac+tmp_frac >= 100000000
-         THEN 1
-         ELSE 0
-         END,
-    gc_date=GREATEST(gc_date, in_reserve_gc),
-    expiration_date=GREATEST(expiration_date, in_reserve_expiration)
-  WHERE reserve_pub=in_reserve_pub;
-
-
-IF NOT FOUND
-THEN
-  RAISE NOTICE 'failed to increase reserve balance from recoup';
-  out_recoup_ok=TRUE;
-  out_internal_failure=TRUE;
-  RETURN;
-END IF;
-
-
-INSERT INTO recoup
-  (coin_pub
-  ,coin_sig
-  ,coin_blind
-  ,amount_val
-  ,amount_frac
-  ,recoup_timestamp
-  ,reserve_out_serial_id
-  )
-VALUES
-  (in_coin_pub
-  ,in_coin_sig
-  ,in_coin_blind
-  ,tmp_val
-  ,tmp_frac
-  ,in_recoup_timestamp
-  ,in_reserve_out_serial_id);
-
--- Normal end, everything is fine.
-out_recoup_ok=TRUE;
-out_recoup_timestamp=in_recoup_timestamp;
-
-END $$;
-
--- COMMENT ON FUNCTION exchange_do_recoup_to_reserve(INT8, INT4, BYTEA, 
BOOLEAN, BOOLEAN)
---  IS 'Executes a recoup of a coin that was withdrawn from a reserve';
-
-
-
-
-
-
-CREATE OR REPLACE FUNCTION exchange_do_recoup_to_coin(
-  IN in_old_coin_pub BYTEA,
-  IN in_rrc_serial INT8,
-  IN in_coin_blind BYTEA,
-  IN in_coin_pub BYTEA,
-  IN in_known_coin_id INT8,
-  IN in_coin_sig BYTEA,
-  IN in_recoup_timestamp INT8,
-  OUT out_recoup_ok BOOLEAN,
-  OUT out_internal_failure BOOLEAN,
-  OUT out_recoup_timestamp INT8)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  tmp_val INT8; -- amount recouped
-DECLARE
-  tmp_frac INT8; -- amount recouped
-BEGIN
-
--- Shards: UPDATE known_coins (by coin_pub)
---         SELECT recoup_refresh (by coin_pub)
---         UPDATE known_coins (by coin_pub)
---         INSERT recoup_refresh (by coin_pub)
-
-
-out_internal_failure=FALSE;
-
-
--- Check remaining balance of the coin.
-SELECT
-   remaining_frac
-  ,remaining_val
- INTO
-   tmp_frac
-  ,tmp_val
-FROM known_coins
-  WHERE coin_pub=in_coin_pub;
-
-IF NOT FOUND
-THEN
-  out_internal_failure=TRUE;
-  out_recoup_ok=FALSE;
-  RETURN;
-END IF;
-
-IF tmp_val + tmp_frac = 0
-THEN
-  -- Check for idempotency
-  SELECT
-      recoup_timestamp
-    INTO
-      out_recoup_timestamp
-    FROM recoup_refresh
-    WHERE coin_pub=in_coin_pub;
-  out_recoup_ok=FOUND;
-  RETURN;
-END IF;
-
--- Update balance of the coin.
-UPDATE known_coins
-  SET
-     remaining_frac=0
-    ,remaining_val=0
-  WHERE coin_pub=in_coin_pub;
-
-
--- Credit the old coin.
-UPDATE known_coins
-  SET
-    remaining_frac=remaining_frac+tmp_frac
-       - CASE
-         WHEN remaining_frac+tmp_frac >= 100000000
-         THEN 100000000
-         ELSE 0
-         END,
-    remaining_val=remaining_val+tmp_val
-       + CASE
-         WHEN remaining_frac+tmp_frac >= 100000000
-         THEN 1
-         ELSE 0
-         END
-  WHERE coin_pub=in_old_coin_pub;
-
-
-IF NOT FOUND
-THEN
-  RAISE NOTICE 'failed to increase old coin balance from recoup';
-  out_recoup_ok=TRUE;
-  out_internal_failure=TRUE;
-  RETURN;
-END IF;
-
-
-INSERT INTO recoup_refresh
-  (coin_pub
-  ,known_coin_id
-  ,coin_sig
-  ,coin_blind
-  ,amount_val
-  ,amount_frac
-  ,recoup_timestamp
-  ,rrc_serial
-  )
-VALUES
-  (in_coin_pub
-  ,in_known_coin_id
-  ,in_coin_sig
-  ,in_coin_blind
-  ,tmp_val
-  ,tmp_frac
-  ,in_recoup_timestamp
-  ,in_rrc_serial);
-
--- Normal end, everything is fine.
-out_recoup_ok=TRUE;
-out_recoup_timestamp=in_recoup_timestamp;
-
-END $$;
-
-
--- COMMENT ON FUNCTION exchange_do_recoup_to_coin(INT8, INT4, BYTEA, BOOLEAN, 
BOOLEAN)
---  IS 'Executes a recoup-refresh of a coin that was obtained from a 
refresh-reveal process';
-
-
-
-CREATE OR REPLACE PROCEDURE exchange_do_gc(
-  IN in_ancient_date INT8,
-  IN in_now INT8)
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  reserve_uuid_min INT8; -- minimum reserve UUID still alive
-DECLARE
-  melt_min INT8; -- minimum melt still alive
-DECLARE
-  coin_min INT8; -- minimum known_coin still alive
-DECLARE
-  deposit_min INT8; -- minimum deposit still alive
-DECLARE
-  reserve_out_min INT8; -- minimum reserve_out still alive
-DECLARE
-  denom_min INT8; -- minimum denomination still alive
-BEGIN
-
-DELETE FROM prewire
-  WHERE finished=TRUE;
-
-DELETE FROM wire_fee
-  WHERE end_date < in_ancient_date;
-
--- TODO: use closing fee as threshold?
-DELETE FROM reserves
-  WHERE gc_date < in_now
-    AND current_balance_val = 0
-    AND current_balance_frac = 0;
-
-SELECT
-     reserve_out_serial_id
-  INTO
-     reserve_out_min
-  FROM reserves_out
-  ORDER BY reserve_out_serial_id ASC
-  LIMIT 1;
-
-DELETE FROM recoup
-  WHERE reserve_out_serial_id < reserve_out_min;
--- FIXME: recoup_refresh lacks GC!
-
-SELECT
-     reserve_uuid
-  INTO
-     reserve_uuid_min
-  FROM reserves
-  ORDER BY reserve_uuid ASC
-  LIMIT 1;
-
-DELETE FROM reserves_out
-  WHERE reserve_uuid < reserve_uuid_min;
-
--- FIXME: this query will be horribly slow;
--- need to find another way to formulate it...
-DELETE FROM denominations
-  WHERE expire_legal < in_now
-    AND denominations_serial NOT IN
-      (SELECT DISTINCT denominations_serial
-         FROM reserves_out)
-    AND denominations_serial NOT IN
-      (SELECT DISTINCT denominations_serial
-         FROM known_coins
-        WHERE coin_pub IN
-          (SELECT DISTINCT coin_pub
-             FROM recoup))
-    AND denominations_serial NOT IN
-      (SELECT DISTINCT denominations_serial
-         FROM known_coins
-        WHERE coin_pub IN
-          (SELECT DISTINCT coin_pub
-             FROM recoup_refresh));
-
-SELECT
-     melt_serial_id
-  INTO
-     melt_min
-  FROM refresh_commitments
-  ORDER BY melt_serial_id ASC
-  LIMIT 1;
-
-DELETE FROM refresh_revealed_coins
-  WHERE melt_serial_id < melt_min;
-
-DELETE FROM refresh_transfer_keys
-  WHERE melt_serial_id < melt_min;
-
-SELECT
-     known_coin_id
-  INTO
-     coin_min
-  FROM known_coins
-  ORDER BY known_coin_id ASC
-  LIMIT 1;
-
-DELETE FROM deposits
-  WHERE known_coin_id < coin_min;
-
-SELECT
-     deposit_serial_id
-  INTO
-     deposit_min
-  FROM deposits
-  ORDER BY deposit_serial_id ASC
-  LIMIT 1;
-
-DELETE FROM refunds
-  WHERE deposit_serial_id < deposit_min;
-
-DELETE FROM aggregation_tracking
-  WHERE deposit_serial_id < deposit_min;
-
-SELECT
-     denominations_serial
-  INTO
-     denom_min
-  FROM denominations
-  ORDER BY denominations_serial ASC
-  LIMIT 1;
-
-DELETE FROM cs_nonce_locks
-  WHERE max_denomination_serial <= denom_min;
-
-END $$;
-
-
-
-
-
-
-
-
-
-CREATE OR REPLACE FUNCTION exchange_do_purse_deposit(
-  IN in_purse_pub BYTEA,
-  IN in_amount_with_fee_val INT8,
-  IN in_amount_with_fee_frac INT4,
-  IN in_coin_pub BYTEA,
-  IN in_coin_sig BYTEA,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  -- FIXME
-END $$;
-
-
-CREATE OR REPLACE FUNCTION exchange_do_purse_merge(
-  IN in_purse_pub BYTEA,
-  IN in_merge_sig BYTEA,
-  IN in_merge_timestamp INT8,
-  IN in_partner_url VARCHAR,
-  IN in_reserve_pub BYTEA,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  -- FIXME
-END $$;
-
-
-CREATE OR REPLACE FUNCTION exchange_do_account_merge(
-  IN in_purse_pub BYTEA,
-  IN in_reserve_pub BYTEA,
-  IN in_reserve_sig BYTEA,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  -- FIXME
-END $$;
-
-
-CREATE OR REPLACE FUNCTION exchange_do_history_request(
-  IN in_reserve_pub BYTEA,
-  IN in_reserve_sig BYTEA,
-  IN in_request_timestamp INT8,
-  IN in_history_fee_val INT8,
-  IN in_history_fee_frac INT4,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  -- FIXME
-END $$;
-
-
-CREATE OR REPLACE FUNCTION exchange_do_close_request(
-  IN in_reserve_pub BYTEA,
-  IN in_reserve_sig BYTEA,
-  OUT out_final_balance_val INT8,
-  OUT out_final_balance_frac INT4,
-  OUT out_balance_ok BOOLEAN,
-  OUT out_conflict BOOLEAN)
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  -- FIXME
-END $$;
-
-
-
--- Complete transaction
-COMMIT;
-
diff --git a/sql/exchange-tables.sql b/sql/exchange-tables.sql
deleted file mode 100644
index 0658594..0000000
--- a/sql/exchange-tables.sql
+++ /dev/null
@@ -1,1139 +0,0 @@
-CREATE OR REPLACE FUNCTION create_partitioned_table(
-   IN table_definition VARCHAR
-  ,IN table_name VARCHAR
-  ,IN main_table_partition_str VARCHAR -- Used only when it is the main table 
- we do not partition shard tables
-  ,IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  IF shard_suffix IS NOT NULL THEN 
-    table_name=table_name || '_' || shard_suffix;
-    main_table_partition_str = '';
-  END IF;
-
-  EXECUTE FORMAT(
-    table_definition,
-    table_name,
-    main_table_partition_str
-  );
-
-END 
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_wire_targets(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(wire_target_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- 
UNIQUE'
-      ',wire_target_h_payto BYTEA PRIMARY KEY CHECK 
(LENGTH(wire_target_h_payto)=32)'
-      ',payto_uri VARCHAR NOT NULL'
-      ',kyc_ok BOOLEAN NOT NULL DEFAULT (FALSE)'
-      ',external_id VARCHAR'
-    ') %s ;'
-    ,'wire_targets'
-    ,'PARTITION BY HASH (wire_target_h_payto)'
-    ,shard_suffix
-  );
-
-END
-$$;
-
--- We need a seperate function for this, as we call create_table only once but 
need to add
--- those constraints to each partition which gets created
-CREATE OR REPLACE FUNCTION add_constraints_to_wire_targets_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  EXECUTE FORMAT (
-    'ALTER TABLE wire_targets_' || partition_suffix || ' '
-      'ADD CONSTRAINT wire_targets_' || partition_suffix || 
'_wire_target_serial_id_key '
-        'UNIQUE (wire_target_serial_id)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_reserves(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'reserves';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(reserve_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY'
-      ',reserve_pub BYTEA PRIMARY KEY CHECK(LENGTH(reserve_pub)=32)'
-      ',current_balance_val INT8 NOT NULL'
-      ',current_balance_frac INT4 NOT NULL'
-      ',expiration_date INT8 NOT NULL'
-      ',gc_date INT8 NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (reserve_pub)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_expiration_index '
-    'ON ' || table_name || ' '
-    '(expiration_date'
-    ',current_balance_val'
-    ',current_balance_frac'
-    ');'
-  );
-  EXECUTE FORMAT (
-    'COMMENT ON INDEX ' || table_name || '_by_expiration_index '
-    'IS ' || quote_literal('used in get_expired_reserves') || ';'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_reserve_uuid_index '
-    'ON ' || table_name || ' '
-    '(reserve_uuid);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_gc_date_index '
-    'ON ' || table_name || ' '
-    '(gc_date);'
-  );
-  EXECUTE FORMAT (
-    'COMMENT ON INDEX ' || table_name || '_by_gc_date_index '
-    'IS ' || quote_literal('for reserve garbage collection') || ';'
-  );
-
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_reserves_in(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR default 'reserves_in';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(reserve_in_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- 
UNIQUE'
-      ',reserve_pub BYTEA PRIMARY KEY' -- REFERENCES reserves (reserve_pub) ON 
DELETE CASCADE'
-      ',wire_reference INT8 NOT NULL'
-      ',credit_val INT8 NOT NULL'
-      ',credit_frac INT4 NOT NULL'
-      ',wire_source_h_payto BYTEA CHECK (LENGTH(wire_source_h_payto)=32)' 
-      ',exchange_account_section TEXT NOT NULL'
-      ',execution_date INT8 NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (reserve_pub)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-  
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_reserve_in_serial_id_index '
-    'ON ' || table_name || ' '
-    '(reserve_in_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_exch_accnt_section_execution_date_idx '
-    'ON ' || table_name || ' '
-    '(exchange_account_section '
-    ',execution_date'
-    ');'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_exch_accnt_reserve_in_serial_id_idx '
-    'ON ' || table_name || ' '
-    '(exchange_account_section,'
-    'reserve_in_serial_id DESC'
-    ');'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_reserves_in_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE reserves_in_' || partition_suffix || ' '
-      'ADD CONSTRAINT reserves_in_' || partition_suffix || 
'_reserve_in_serial_id_key '
-        'UNIQUE (reserve_in_serial_id)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_reserves_close(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(close_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE / 
PRIMARY KEY'
-      ',reserve_pub BYTEA NOT NULL' -- REFERENCES reserves (reserve_pub) ON 
DELETE CASCADE'
-      ',execution_date INT8 NOT NULL'
-      ',wtid BYTEA NOT NULL CHECK (LENGTH(wtid)=32)'
-      ',wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32)'
-      ',amount_val INT8 NOT NULL'
-      ',amount_frac INT4 NOT NULL'
-      ',closing_fee_val INT8 NOT NULL'
-      ',closing_fee_frac INT4 NOT NULL'
-    ') %s ;'
-    ,'reserves_close'
-    ,'PARTITION BY HASH (reserve_pub)'
-    ,shard_suffix
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_reserves_close_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE reserves_close_' || partition_suffix || ' '
-      'ADD CONSTRAINT reserves_close_' || partition_suffix || 
'_close_uuid_pkey '
-        'PRIMARY KEY (close_uuid)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_reserves_out(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR default 'reserves_out';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(reserve_out_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- 
UNIQUE'
-      ',h_blind_ev BYTEA CHECK (LENGTH(h_blind_ev)=64) UNIQUE'
-      ',denominations_serial INT8 NOT NULL' -- REFERENCES denominations 
(denominations_serial)'
-      ',denom_sig BYTEA NOT NULL'
-      ',reserve_uuid INT8 NOT NULL' -- REFERENCES reserves (reserve_uuid) ON 
DELETE CASCADE'
-      ',reserve_sig BYTEA NOT NULL CHECK (LENGTH(reserve_sig)=64)'
-      ',execution_date INT8 NOT NULL'
-      ',amount_with_fee_val INT8 NOT NULL'
-      ',amount_with_fee_frac INT4 NOT NULL'
-    ') %s ;'
-    ,'reserves_out'
-    ,'PARTITION BY HASH (h_blind_ev)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_reserve_out_serial_id_index '
-    'ON ' || table_name || ' '
-    '(reserve_out_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_reserve_uuid_and_execution_date_index '
-    'ON ' || table_name || ' '
-    '(reserve_uuid, execution_date);'
-  );
-  EXECUTE FORMAT (
-    'COMMENT ON INDEX ' || table_name || 
'_by_reserve_uuid_and_execution_date_index '
-    'IS ' || quote_literal('for get_reserves_out and 
exchange_do_withdraw_limit_check') || ';'
-  );
-
-END
-$$;
-
-
-CREATE OR REPLACE FUNCTION add_constraints_to_reserves_out_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE reserves_out_' || partition_suffix || ' '
-      'ADD CONSTRAINT reserves_out_' || partition_suffix || 
'_reserve_out_serial_id_key '
-        'UNIQUE (reserve_out_serial_id)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_known_coins(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR default 'known_coins';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(known_coin_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',denominations_serial INT8 NOT NULL' -- REFERENCES denominations 
(denominations_serial) ON DELETE CASCADE'
-      ',coin_pub BYTEA NOT NULL PRIMARY KEY CHECK (LENGTH(coin_pub)=32)'
-      ',age_commitment_hash BYTEA CHECK (LENGTH(age_commitment_hash)=32)'
-      ',denom_sig BYTEA NOT NULL'
-      ',remaining_val INT8 NOT NULL'
-      ',remaining_frac INT4 NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (coin_pub)' -- FIXME: or include denominations_serial? 
or multi-level partitioning?;
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_known_coin_id_index '
-    'ON ' || table_name || ' '
-    '(known_coin_id);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_known_coins_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE known_coins_' || partition_suffix || ' '
-      'ADD CONSTRAINT known_coins_' || partition_suffix || 'k_nown_coin_id_key 
'
-        'UNIQUE (known_coin_id)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_refresh_commitments(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'refresh_commitments';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(melt_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',rc BYTEA PRIMARY KEY CHECK (LENGTH(rc)=64)'
-      ',old_coin_pub BYTEA NOT NULL' -- REFERENCES known_coins (coin_pub) ON 
DELETE CASCADE'
-      ',old_coin_sig BYTEA NOT NULL CHECK(LENGTH(old_coin_sig)=64)'
-      ',amount_with_fee_val INT8 NOT NULL'
-      ',amount_with_fee_frac INT4 NOT NULL'
-      ',noreveal_index INT4 NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (rc)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_melt_serial_id_index '
-    'ON ' || table_name || ' '
-    '(melt_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_old_coin_pub_index '
-    'ON ' || table_name || ' '
-    '(old_coin_pub);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_refresh_commitments_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE refresh_commitments_' || partition_suffix || ' '
-      'ADD CONSTRAINT refresh_commitments_' || partition_suffix || 
'_melt_serial_id_key '
-        'UNIQUE (melt_serial_id)'
-  );
-END
-$$;
-
---------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_refresh_revealed_coins(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'refresh_revealed_coins';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(rrc_serial BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',melt_serial_id INT8 NOT NULL' -- REFERENCES refresh_commitments 
(melt_serial_id) ON DELETE CASCADE'
-      ',freshcoin_index INT4 NOT NULL'
-      ',link_sig BYTEA NOT NULL CHECK(LENGTH(link_sig)=64)'
-      ',denominations_serial INT8 NOT NULL' -- REFERENCES denominations 
(denominations_serial) ON DELETE CASCADE'
-      ',coin_ev BYTEA NOT NULL' -- UNIQUE'
-      ',h_coin_ev BYTEA NOT NULL CHECK(LENGTH(h_coin_ev)=64)' -- UNIQUE'
-      ',ev_sig BYTEA NOT NULL'
-      ',ewv BYTEA NOT NULL'
-      --  ,PRIMARY KEY (melt_serial_id, freshcoin_index) -- done per shard
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (melt_serial_id)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-  
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_coins_by_rrc_serial_index 
'
-    'ON ' || table_name || ' '
-    '(rrc_serial);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_coins_by_melt_serial_id_index '
-    'ON ' || table_name || ' '
-    '(melt_serial_id);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_refresh_revealed_coins_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE refresh_revealed_coins_' || partition_suffix || ' '
-      'ADD CONSTRAINT refresh_revealed_coins_' || partition_suffix || 
'_rrc_serial_key '
-        'UNIQUE (rrc_serial) '
-      ',ADD CONSTRAINT refresh_revealed_coins_' || partition_suffix || 
'_coin_ev_key '
-        'UNIQUE (coin_ev) '
-      ',ADD CONSTRAINT refresh_revealed_coins_' || partition_suffix || 
'_h_coin_ev_key '
-        'UNIQUE (h_coin_ev) '
-      ',ADD PRIMARY KEY (melt_serial_id, freshcoin_index) '
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_refresh_transfer_keys(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'refresh_transfer_keys';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(rtc_serial BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',melt_serial_id INT8 PRIMARY KEY' -- REFERENCES refresh_commitments 
(melt_serial_id) ON DELETE CASCADE'
-      ',transfer_pub BYTEA NOT NULL CHECK(LENGTH(transfer_pub)=32)'
-      ',transfer_privs BYTEA NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (melt_serial_id)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_rtc_serial_index '
-    'ON ' || table_name || ' '
-    '(rtc_serial);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_refresh_transfer_keys_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE refresh_transfer_keys_' || partition_suffix || ' '
-      'ADD CONSTRAINT refresh_transfer_keys_' || partition_suffix || 
'_rtc_serial_key '
-        'UNIQUE (rtc_serial)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_deposits(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'deposits';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(deposit_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- PRIMARY 
KEY'
-      ',shard INT8 NOT NULL'
-      ',coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)' -- REFERENCES 
known_coins (coin_pub) ON DELETE CASCADE
-      ',known_coin_id INT8 NOT NULL' -- REFERENCES known_coins (known_coin_id) 
ON DELETE CASCADE' --- FIXME: column needed???
-      ',amount_with_fee_val INT8 NOT NULL'
-      ',amount_with_fee_frac INT4 NOT NULL'
-      ',wallet_timestamp INT8 NOT NULL'
-      ',exchange_timestamp INT8 NOT NULL'
-      ',refund_deadline INT8 NOT NULL'
-      ',wire_deadline INT8 NOT NULL'
-      ',merchant_pub BYTEA NOT NULL CHECK (LENGTH(merchant_pub)=32)'
-      ',h_contract_terms BYTEA NOT NULL CHECK (LENGTH(h_contract_terms)=64)'
-      ',coin_sig BYTEA NOT NULL CHECK (LENGTH(coin_sig)=64)'
-      ',wire_salt BYTEA NOT NULL CHECK (LENGTH(wire_salt)=16)'
-      ',wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32)'
-      ',tiny BOOLEAN NOT NULL DEFAULT FALSE'
-      ',done BOOLEAN NOT NULL DEFAULT FALSE'
-      ',extension_blocked BOOLEAN NOT NULL DEFAULT FALSE'
-      ',extension_details_serial_id INT8' -- REFERENCES extension_details 
(extension_details_serial_id) ON DELETE CASCADE'
-      ',UNIQUE (shard, known_coin_id, merchant_pub, h_contract_terms)'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (shard)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  -- FIXME: we sometimes go ONLY by 'deposit_serial_id',
-  --        check if queries could be improved by adding shard or adding 
another index without shard here, or inverting the order of the index here!
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_deposit_by_serial_id_index '
-    'ON ' || table_name || ' '
-    '(shard,deposit_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_coin_pub_index '
-    'ON ' || table_name || ' ' 
-    '(coin_pub);'
-  );
-
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_deposits_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE deposits_' || partition_suffix || ' '
-      'ADD CONSTRAINT deposits_' || partition_suffix || 
'_deposit_serial_id_pkey '
-        'PRIMARY KEY (deposit_serial_id)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_deposits_by_ready(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'deposits_by_ready';
-BEGIN
-
-  PERFORM create_partitioned_table(
-  'CREATE TABLE IF NOT EXISTS %I'
-    '(wire_deadline INT8 NOT NULL'
-    ',shard INT8 NOT NULL'
-    ',coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)'
-    ',deposit_serial_id INT8'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY RANGE (wire_deadline)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_main_index '
-    'ON ' || table_name || ' '
-    '(wire_deadline ASC, shard ASC, coin_pub);'
-  );
-
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_deposits_for_matching(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'deposits_for_matching';
-BEGIN
-
-  PERFORM create_partitioned_table(
-  'CREATE TABLE IF NOT EXISTS %I'
-    '(refund_deadline INT8 NOT NULL'
-    ',shard INT8 NOT NULL'
-    ',coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)'
-    ',deposit_serial_id INT8'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY RANGE (refund_deadline)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_main_index '
-    'ON ' || table_name || ' '
-    '(refund_deadline ASC, shard, coin_pub);'
-  );
-
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_refunds(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'refunds';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(refund_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',shard INT8 NOT NULL' -- REFERENCES deposits (shard) 
-      ',deposit_serial_id INT8 NOT NULL' -- REFERENCES deposits 
(deposit_serial_id) ON DELETE CASCADE'
-      ',merchant_sig BYTEA NOT NULL CHECK(LENGTH(merchant_sig)=64)'
-      ',rtransaction_id INT8 NOT NULL'
-      ',amount_with_fee_val INT8 NOT NULL'
-      ',amount_with_fee_frac INT4 NOT NULL'
-      -- ,PRIMARY KEY (deposit_serial_id, rtransaction_id) -- done per shard!
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (shard)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_refund_serial_id_index 
'
-    'ON ' || table_name || ' '
-    '(refund_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_deposit_serial_id_index '
-    'ON ' || table_name || ' '
-    '(shard,deposit_serial_id);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_refunds_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE refunds_' || partition_suffix || ' '
-      'ADD CONSTRAINT refunds_' || partition_suffix || '_refund_serial_id_key '
-        'UNIQUE (refund_serial_id) '
-      ',ADD PRIMARY KEY (deposit_serial_id, rtransaction_id) '
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_wire_out(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'wire_out';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(wireout_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY' -- PRIMARY KEY'
-      ',execution_date INT8 NOT NULL'
-      ',wtid_raw BYTEA UNIQUE NOT NULL CHECK (LENGTH(wtid_raw)=32)'
-      ',wire_target_h_payto BYTEA CHECK (LENGTH(wire_target_h_payto)=32)'
-      ',exchange_account_section TEXT NOT NULL'
-      ',amount_val INT8 NOT NULL'
-      ',amount_frac INT4 NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (wtid_raw)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_wireout_uuid_index '
-    'ON ' || table_name || ' '
-    '(wireout_uuid);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_wire_target_h_payto_index '
-    'ON ' || table_name || ' '
-    '(wire_target_h_payto);'
-  );
-
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_wire_out_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS void
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE wire_out_' || partition_suffix || ' '
-      'ADD CONSTRAINT wire_out_' || partition_suffix || '_wireout_uuid_pkey '
-        'PRIMARY KEY (wireout_uuid)'
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_aggregation_tracking(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'aggregation_tracking';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(aggregation_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- 
UNIQUE'
-       ',deposit_serial_id INT8 PRIMARY KEY' -- REFERENCES deposits 
(deposit_serial_id) ON DELETE CASCADE' -- FIXME chnage to coint_pub + 
deposit_serial_id for more efficient depost -- or something else ???
-      ',wtid_raw BYTEA NOT NULL' -- CONSTRAINT wire_out_ref REFERENCES 
wire_out(wtid_raw) ON DELETE CASCADE DEFERRABLE'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (deposit_serial_id)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_aggregation_serial_id_index '
-    'ON ' || table_name || ' '
-    '(aggregation_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_wtid_raw_index '
-    'ON ' || table_name || ' '
-    '(wtid_raw);'
-  );
-  EXECUTE FORMAT (
-    'COMMENT ON INDEX ' || table_name || '_by_wtid_raw_index '
-    'IS ' || quote_literal('for lookup_transactions') || ';'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_aggregation_tracking_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE aggregation_tracking_' || partition_suffix || ' '
-      'ADD CONSTRAINT aggregation_tracking_' || partition_suffix || 
'_aggregation_serial_id_key '
-        'UNIQUE (aggregation_serial_id) '
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_recoup(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'recoup';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(recoup_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)' -- REFERENCES 
known_coins (coin_pub)
-      ',coin_sig BYTEA NOT NULL CHECK(LENGTH(coin_sig)=64)'
-      ',coin_blind BYTEA NOT NULL CHECK(LENGTH(coin_blind)=32)'
-      ',amount_val INT8 NOT NULL'
-      ',amount_frac INT4 NOT NULL'
-      ',recoup_timestamp INT8 NOT NULL'
-      ',reserve_out_serial_id INT8 NOT NULL' -- REFERENCES reserves_out 
(reserve_out_serial_id) ON DELETE CASCADE'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (coin_pub);'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-  
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_recoup_uuid_index '
-    'ON ' || table_name || ' '
-    '(recoup_uuid);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_reserve_out_serial_id_index '
-    'ON ' || table_name || ' '
-    '(reserve_out_serial_id);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_coin_pub_index '
-    'ON ' || table_name || ' '
-    '(coin_pub);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_recoup_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE recoup_' || partition_suffix || ' '
-      'ADD CONSTRAINT recoup_' || partition_suffix || '_recoup_uuid_key '
-        'UNIQUE (recoup_uuid) '
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_recoup_by_reserve(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'recoup_by_reserve';
-BEGIN
-
-  PERFORM create_partitioned_table(
-  'CREATE TABLE IF NOT EXISTS %I'
-    '(reserve_out_serial_id INT8 NOT NULL' -- REFERENCES reserves 
(reserve_out_serial_id) ON DELETE CASCADE
-    ',coin_pub BYTEA CHECK (LENGTH(coin_pub)=32)'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (reserve_out_serial_id)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_main_index '
-    'ON ' || table_name || ' '
-    '(reserve_out_serial_id);'
-  );
-
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_reserves_out_by_reserve(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'reserves_out_by_reserve';
-BEGIN
-
-  PERFORM create_partitioned_table(
-  'CREATE TABLE IF NOT EXISTS %I'
-    '(reserve_uuid INT8 NOT NULL' -- REFERENCES reserves (reserve_uuid) ON 
DELETE CASCADE
-    ',h_blind_ev BYTEA CHECK (LENGTH(h_blind_ev)=64)'
-    ') %s '
-    ,table_name
-    ,'PARTITION BY HASH (reserve_uuid)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_main_index '
-    'ON ' || table_name || ' '
-    '(reserve_uuid);'
-  );
-
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_recoup_refresh(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'recoup_refresh';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(recoup_refresh_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY' -- UNIQUE'
-      ',coin_pub BYTEA NOT NULL CHECK (LENGTH(coin_pub)=32)' -- REFERENCES 
known_coins (coin_pub)
-      ',known_coin_id BIGINT NOT NULL' -- REFERENCES known_coins 
(known_coin_id) ON DELETE CASCADE
-      ',coin_sig BYTEA NOT NULL CHECK(LENGTH(coin_sig)=64)'
-      ',coin_blind BYTEA NOT NULL CHECK(LENGTH(coin_blind)=32)'
-      ',amount_val INT8 NOT NULL'
-      ',amount_frac INT4 NOT NULL'
-      ',recoup_timestamp INT8 NOT NULL'
-      ',rrc_serial INT8 NOT NULL' -- REFERENCES refresh_revealed_coins 
(rrc_serial) ON DELETE CASCADE -- UNIQUE'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (coin_pub)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || 
'_by_recoup_refresh_uuid_index '
-    'ON ' || table_name || ' '
-    '(recoup_refresh_uuid);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_rrc_serial_index '
-    'ON ' || table_name || ' '
-    '(rrc_serial);'
-  );
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_coin_pub_index '
-    'ON ' || table_name || ' '
-    '(coin_pub);'
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_recoup_refresh_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE recoup_refresh_' || partition_suffix || ' '
-      'ADD CONSTRAINT recoup_refresh_' || partition_suffix || 
'_recoup_refresh_uuid_key '
-        'UNIQUE (recoup_refresh_uuid) '
-  );
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_prewire(
-  IN shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  table_name VARCHAR DEFAULT 'prewire';
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(prewire_uuid BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY'
-      ',wire_method TEXT NOT NULL'
-      ',finished BOOLEAN NOT NULL DEFAULT false'
-      ',failed BOOLEAN NOT NULL DEFAULT false'
-      ',buf BYTEA NOT NULL'
-    ') %s ;'
-    ,table_name
-    ,'PARTITION BY HASH (prewire_uuid)'
-    ,shard_suffix
-  );
-
-  table_name = concat_ws('_', table_name, shard_suffix);
-
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_finished_index '
-    'ON ' || table_name || ' '
-    '(finished);'
-  );
-  EXECUTE FORMAT (
-    'COMMENT ON INDEX ' || table_name || '_by_finished_index '
-    'IS ' || quote_literal('for gc_prewire') || ';'
-  );
-  -- FIXME: find a way to combine these two indices?
-  EXECUTE FORMAT (
-    'CREATE INDEX IF NOT EXISTS ' || table_name || '_by_failed_finished_index '
-    'ON ' || table_name || ' '
-    '(failed,finished);'
-  );
-  EXECUTE FORMAT (
-    'COMMENT ON INDEX ' || table_name || '_by_failed_finished_index '
-    'IS ' || quote_literal('for wire_prepare_data_get') || ';'
-  );
-
-END
-$$;
-
------------------------------------------------------------
-
-CREATE OR REPLACE FUNCTION create_table_cs_nonce_locks(
-  shard_suffix VARCHAR DEFAULT NULL
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  PERFORM create_partitioned_table(
-    'CREATE TABLE IF NOT EXISTS %I'
-      '(cs_nonce_lock_serial_id BIGINT GENERATED BY DEFAULT AS IDENTITY' -- 
UNIQUE'
-      ',nonce BYTEA PRIMARY KEY CHECK (LENGTH(nonce)=32)'
-      ',op_hash BYTEA NOT NULL CHECK (LENGTH(op_hash)=64)'
-      ',max_denomination_serial INT8 NOT NULL'
-    ') %s ;'
-    ,'cs_nonce_locks'
-    ,'PARTITION BY HASH (nonce)'
-    ,shard_suffix
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION add_constraints_to_cs_nonce_locks_partition(
-  IN partition_suffix VARCHAR
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-  EXECUTE FORMAT (
-    'ALTER TABLE cs_nonce_locks_' || partition_suffix || ' '
-      'ADD CONSTRAINT cs_nonce_locks_' || partition_suffix || 
'_cs_nonce_lock_serial_id_key '
-        'UNIQUE (cs_nonce_lock_serial_id)'
-  );
-END
-$$;
-
------------------------------------------------------------
diff --git a/sql/partition-0001.sql b/sql/partition-0001.sql
deleted file mode 100644
index f3910c6..0000000
--- a/sql/partition-0001.sql
+++ /dev/null
@@ -1,601 +0,0 @@
-BEGIN;
-
-CREATE OR REPLACE FUNCTION create_table_partition(
-    source_table_name VARCHAR
-    ,modulus INTEGER
-    ,partition_num INTEGER
-  )
-  RETURNS VOID
-  LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  RAISE NOTICE 'Creating partition %_%', source_table_name, partition_num;
-
-  EXECUTE FORMAT(
-    'CREATE TABLE IF NOT EXISTS %I '
-      'PARTITION OF %I '
-      'FOR VALUES WITH (MODULUS %s, REMAINDER %s)'
-    ,source_table_name || '_' || partition_num
-    ,source_table_name
-    ,modulus
-    ,partition_num-1
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION detach_default_partitions()
-  RETURNS VOID
-  LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  RAISE NOTICE 'Detaching all default table partitions';
-
-  ALTER TABLE IF EXISTS wire_targets
-    DETACH PARTITION wire_targets_default;
-
-  ALTER TABLE IF EXISTS reserves
-    DETACH PARTITION reserves_default;
-
-  ALTER TABLE IF EXISTS reserves_in
-    DETACH PARTITION reserves_in_default;
-  
-  ALTER TABLE IF EXISTS reserves_close
-    DETACH PARTITION reserves_close_default;
-  
-  ALTER TABLE IF EXISTS reserves_out
-    DETACH PARTITION reserves_out_default;
-  
-  ALTER TABLE IF EXISTS known_coins
-    DETACH PARTITION known_coins_default;
-  
-  ALTER TABLE IF EXISTS refresh_commitments
-    DETACH PARTITION refresh_commitments_default;
-  
-  ALTER TABLE IF EXISTS refresh_revealed_coins
-    DETACH PARTITION refresh_revealed_coins_default;
-  
-  ALTER TABLE IF EXISTS refresh_transfer_keys
-    DETACH PARTITION refresh_transfer_keys_default;
-  
-  ALTER TABLE IF EXISTS deposits
-    DETACH PARTITION deposits_default;
-
---  ALTER TABLE IF EXISTS deposits_by_ready
---    DETACH PARTITION deposits_by_ready_default;
---
---  ALTER TABLE IF EXISTS deposits_for_matching
---    DETACH PARTITION deposits_default_for_matching_default;
-  
-  ALTER TABLE IF EXISTS refunds
-    DETACH PARTITION refunds_default;
-  
-  ALTER TABLE IF EXISTS wire_out
-    DETACH PARTITION wire_out_default;
-  
-  ALTER TABLE IF EXISTS aggregation_tracking
-    DETACH PARTITION aggregation_tracking_default;
-  
-  ALTER TABLE IF EXISTS recoup
-    DETACH PARTITION recoup_default;
-  
-  ALTER TABLE IF EXISTS recoup_by_reserve
-    DETACH PARTITION recoup_by_reserve_default;
-
-  ALTER TABLE IF EXISTS reserves_out_by_reserve
-    DETACH PARTITION reserves_out_by_reserve_default;
-
-  ALTER TABLE IF EXISTS recoup_refresh
-    DETACH PARTITION recoup_refresh_default;
-  
-  ALTER TABLE IF EXISTS prewire
-    DETACH PARTITION prewire_default;
-  
-  ALTER TABLE IF EXISTS cs_nonce_locks
-    DETACH partition cs_nonce_locks_default;
-
-END
-$$;
-
-COMMENT ON FUNCTION detach_default_partitions
-  IS 'We need to drop default and create new one before deleting the default 
partitions
-      otherwise constraints get lost too. Might be needed in shardig too';
-
-
-CREATE OR REPLACE FUNCTION drop_default_partitions()
-  RETURNS VOID
-  LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  RAISE NOTICE 'Dropping default table partitions';
-
-  DROP TABLE IF EXISTS wire_targets_default;
-  DROP TABLE IF EXISTS reserves_default;
-  DROP TABLE IF EXISTS reserves_in_default;
-  DROP TABLE IF EXISTS reserves_close_default;
-  DROP TABLE IF EXISTS reserves_out_default;
-  DROP TABLE IF EXISTS known_coins_default;
-  DROP TABLE IF EXISTS refresh_commitments_default;
-  DROP TABLE IF EXISTS refresh_revealed_coins_default;
-  DROP TABLE IF EXISTS refresh_transfer_keys_default;
-  DROP TABLE IF EXISTS deposits_default;
-  --DROP TABLE IF EXISTS deposits_by_ready_default;
-  --DROP TABLE IF EXISTS deposits_for_matching_default;
-  DROP TABLE IF EXISTS refunds_default;
-  DROP TABLE IF EXISTS wire_out_default;
-  DROP TABLE IF EXISTS aggregation_tracking_default;
-  DROP TABLE IF EXISTS recoup_default;
-  DROP TABLE IF EXISTS recoup_by_reserve_default;
-  DROP TABLE IF EXISTS reserves_out_by_reserve_default;
-  DROP TABLE IF EXISTS recoup_refresh_default;
-  DROP TABLE IF EXISTS prewire_default;
-  DROP TABLE IF EXISTS cs_nonce_locks_default;
-
-END
-$$;
-
-COMMENT ON FUNCTION drop_default_partitions
-  IS 'Drop all default partitions once other partitions are attached.
-      Might be needed in sharding too.';
-
-CREATE OR REPLACE FUNCTION create_partitions(
-    num_partitions INTEGER
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-DECLARE
-  modulus INTEGER;
-BEGIN
-
-  modulus := num_partitions;
-
-  PERFORM detach_default_partitions();
-
-  LOOP
-    PERFORM create_table_partition(
-      'wire_targets'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_wire_targets_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'reserves'
-      ,modulus
-      ,num_partitions
-    );
-
-    PERFORM create_table_partition(
-      'reserves_in'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_reserves_in_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'reserves_close'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_reserves_close_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'reserves_out'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_reserves_out_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'known_coins'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_known_coins_partition(num_partitions::varchar);
-    
-    PERFORM create_table_partition(
-      'refresh_commitments'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_refresh_commitments_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'refresh_revealed_coins'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_refresh_revealed_coins_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'refresh_transfer_keys'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_refresh_transfer_keys_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'deposits'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_deposits_partition(num_partitions::varchar);
-
---    PERFORM create_table_partition(
---      'deposits_by_ready'
---      ,modulus
---      ,num_partitions
---    );
---
---    PERFORM create_table_partition(
---      'deposits_for_matching'
---      ,modulus
---      ,num_partitions
---    );
-
-    PERFORM create_table_partition(
-      'refunds'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_refunds_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'wire_out'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_wire_out_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'aggregation_tracking'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_aggregation_tracking_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'recoup'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM add_constraints_to_recoup_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'recoup_by_reserve'
-      ,modulus
-      ,num_partitions
-    );
-
-    PERFORM create_table_partition(
-      'reserves_out_by_reserve'
-      ,modulus
-      ,num_partitions
-    );
-
-    PERFORM create_table_partition(
-      'recoup_refresh'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_recoup_refresh_partition(num_partitions::varchar);
-
-    PERFORM create_table_partition(
-      'prewire'
-      ,modulus
-      ,num_partitions
-    );
-
-    PERFORM create_table_partition(
-      'cs_nonce_locks'
-      ,modulus
-      ,num_partitions
-    );
-    PERFORM 
add_constraints_to_cs_nonce_locks_partition(num_partitions::varchar);
-
-    num_partitions=num_partitions-1;
-    EXIT WHEN num_partitions=0;
-
-  END LOOP;
-
-  PERFORM drop_default_partitions();
-
-END
-$$;
-
-
-CREATE OR REPLACE FUNCTION create_foreign_table(
-    source_table_name VARCHAR
-    ,modulus INTEGER
-    ,shard_suffix VARCHAR
-    ,current_shard_num INTEGER
-  )
-  RETURNS VOID
-  LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  RAISE NOTICE 'Creating %_% on %', source_table_name, shard_suffix, 
shard_suffix;
-
-  EXECUTE FORMAT(
-    'CREATE FOREIGN TABLE IF NOT EXISTS %I '
-      'PARTITION OF %I '
-      'FOR VALUES WITH (MODULUS %s, REMAINDER %s) '
-      'SERVER %I'
-    ,source_table_name || '_' || shard_suffix
-    ,source_table_name
-    ,modulus
-    ,current_shard_num-1
-    ,shard_suffix
-  );
-
-  EXECUTE FORMAT(
-    'ALTER FOREIGN TABLE %I OWNER TO "taler-exchange-httpd"',
-    source_table_name || '_' || shard_suffix
-  );
-
-END
-$$;
-
-CREATE OR REPLACE FUNCTION master_prepare_sharding()
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  -- CREATE EXTENSION IF NOT EXISTS postgres_fdw;
-
-  PERFORM detach_default_partitions();
-
-  ALTER TABLE IF EXISTS wire_targets
-    DROP CONSTRAINT IF EXISTS wire_targets_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS reserves
-    DROP CONSTRAINT IF EXISTS reserves_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS reserves_in
-    DROP CONSTRAINT IF EXISTS reserves_in_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS reserves_close
-    DROP CONSTRAINT IF EXISTS reserves_close_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS reserves_out
-    DROP CONSTRAINT IF EXISTS reserves_out_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS reserves_out_denominations_serial_fkey
-    ,DROP CONSTRAINT IF EXISTS reserves_out_h_blind_ev_key
-  ;
-
-  ALTER TABLE IF EXISTS known_coins
-    DROP CONSTRAINT IF EXISTS known_coins_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS known_coins_denominations_serial_fkey
-  ;
-
-  ALTER TABLE IF EXISTS refresh_commitments
-    DROP CONSTRAINT IF EXISTS refresh_commitments_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS refresh_old_coin_pub_fkey
-  ;
-
-  ALTER TABLE IF EXISTS refresh_revealed_coins
-    DROP CONSTRAINT IF EXISTS refresh_revealed_coins_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS refresh_revealed_coins_denominations_serial_fkey
-  ;
-
-  ALTER TABLE IF EXISTS refresh_transfer_keys
-    DROP CONSTRAINT IF EXISTS refresh_transfer_keys_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS deposits
-    DROP CONSTRAINT IF EXISTS deposits_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS deposits_extension_details_serial_id_fkey
-    ,DROP CONSTRAINT IF EXISTS 
deposits_shard_known_coin_id_merchant_pub_h_contract_terms_key CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS refunds
-    DROP CONSTRAINT IF EXISTS refunds_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS wire_out
-    DROP CONSTRAINT IF EXISTS wire_out_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS wire_out_wtid_raw_key CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS aggregation_tracking
-    DROP CONSTRAINT IF EXISTS aggregation_tracking_pkey CASCADE
-    ,DROP CONSTRAINT IF EXISTS aggregation_tracking_wtid_raw_fkey
-  ;
-
-  ALTER TABLE IF EXISTS recoup
-    DROP CONSTRAINT IF EXISTS recoup_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS recoup_refresh
-    DROP CONSTRAINT IF EXISTS recoup_refresh_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS prewire
-    DROP CONSTRAINT IF EXISTS prewire_pkey CASCADE
-  ;
-
-  ALTER TABLE IF EXISTS cs_nonce_locks
-    DROP CONSTRAINT IF EXISTS cs_nonce_locks_pkey CASCADE
-  ;
-
-END
-$$;
-  
-
-CREATE OR REPLACE FUNCTION create_shard_server(
-    shard_suffix VARCHAR
-    ,total_num_shards INTEGER
-    ,current_shard_num INTEGER
-    ,remote_host VARCHAR
-    ,remote_user VARCHAR
-    ,remote_user_password VARCHAR
-    ,remote_db_name VARCHAR DEFAULT 'taler-exchange'
-    ,remote_port INTEGER DEFAULT '5432'
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  RAISE NOTICE 'Creating server %s', remote_host;
-
-  EXECUTE FORMAT(
-    'CREATE SERVER IF NOT EXISTS %I '
-      'FOREIGN DATA WRAPPER postgres_fdw '
-      'OPTIONS (dbname %L, host %L, port %L)'
-    ,shard_suffix
-    ,remote_db_name
-    ,remote_host
-    ,remote_port
-  );
-
-  EXECUTE FORMAT(
-    'CREATE USER MAPPING IF NOT EXISTS '
-      'FOR "taler-exchange-httpd" SERVER %I '
-      'OPTIONS (user %L, password %L)'
-    ,shard_suffix
-    ,remote_user
-    ,remote_user_password
-  );
-
-  PERFORM create_foreign_table(
-    'wire_targets'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'reserves'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'reserves_in'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'reserves_out'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'reserves_close'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'known_coins'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'refresh_commitments'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'refresh_revealed_coins'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'refresh_transfer_keys'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'deposits'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
---  PERFORM create_foreign_table(
---    'deposits_by_ready'
---    ,total_num_shards
---    ,shard_suffix
---    ,current_shard_num
---  );
---  PERFORM create_foreign_table(
---    'deposits_for_matching'
---    ,total_num_shards
---    ,shard_suffix
---    ,current_shard_num
---  );
-  PERFORM create_foreign_table(
-    'refunds'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'wire_out'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'aggregation_tracking'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'recoup'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'recoup_by_reserve'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'reserves_out_by_reserve'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'recoup_refresh'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'prewire'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-  PERFORM create_foreign_table(
-    'cs_nonce_locks'
-    ,total_num_shards
-    ,shard_suffix
-    ,current_shard_num
-  );
-
-END
-$$;
-
-COMMIT;
diff --git a/sql/shard-0001.sql b/sql/shard-0001.sql
deleted file mode 100644
index a5134b3..0000000
--- a/sql/shard-0001.sql
+++ /dev/null
@@ -1,69 +0,0 @@
-BEGIN;
-
-CREATE OR REPLACE FUNCTION setup_shard(
-  shard_suffix VARCHAR
-)
-RETURNS VOID
-LANGUAGE plpgsql
-AS $$
-BEGIN
-
-  PERFORM create_table_wire_targets(shard_suffix);
-  PERFORM add_constraints_to_wire_targets_partition(shard_suffix);
-
-  PERFORM create_table_reserves(shard_suffix);
-
-  PERFORM create_table_reserves_in(shard_suffix);
-  PERFORM add_constraints_to_reserves_in_partition(shard_suffix);
-
-  PERFORM create_table_reserves_close(shard_suffix);
-
-  PERFORM create_table_reserves_out(shard_suffix);
-
-  PERFORM create_table_known_coins(shard_suffix);
-  PERFORM add_constraints_to_known_coins_partition(shard_suffix);
-
-  PERFORM create_table_refresh_commitments(shard_suffix);
-  PERFORM add_constraints_to_refresh_commitments_partition(shard_suffix);
- 
-  PERFORM create_table_refresh_revealed_coins(shard_suffix);
-  PERFORM add_constraints_to_refresh_revealed_coins_partition(shard_suffix);
-  
-  PERFORM create_table_refresh_transfer_keys(shard_suffix);
-  PERFORM add_constraints_to_refresh_transfer_keys_partition(shard_suffix);
-  
-  PERFORM create_table_deposits(shard_suffix);
-  PERFORM add_constraints_to_deposits_partition(shard_suffix);
-
-  PERFORM create_table_deposits_by_ready(shard_suffix);
-
-  PERFORM create_table_deposits_for_matching(shard_suffix);
-  
-  PERFORM create_table_refunds(shard_suffix);
-  PERFORM add_constraints_to_refunds_partition(shard_suffix);
-  
-  PERFORM create_table_wire_out(shard_suffix);
-  PERFORM add_constraints_to_wire_out_partition(shard_suffix);
-  
-  PERFORM create_table_aggregation_tracking(shard_suffix);
-  PERFORM add_constraints_to_aggregation_tracking_partition(shard_suffix);
-
-  PERFORM create_table_recoup(shard_suffix);
-  PERFORM add_constraints_to_recoup_partition(shard_suffix);
-
-  PERFORM create_table_recoup_by_reserve(shard_suffix);
-
-  PERFORM create_table_reserves_out_by_reserve(shard_suffix);
-
-  PERFORM create_table_recoup_refresh(shard_suffix);
-  PERFORM add_constraints_to_recoup_refresh_partition(shard_suffix);
-
-  PERFORM create_table_prewire(shard_suffix);
-
-  PERFORM create_table_cs_nonce_locks(shard_suffix);
-  PERFORM add_constraints_to_cs_nonce_locks_partition(shard_suffix);
-
-END
-$$;
-  
-COMMIT;

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]