commit 3ceca6171d3cf482382f4aae74070954348cf374
parent 84c27329fcb46b65505949f60b63fa88140095e4
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Thu, 23 Apr 2026 15:38:45 +0200
build: Migrate to meson
Diffstat:
17 files changed, 2604 insertions(+), 11 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -12,7 +12,6 @@
.libs/
.svn/
Makefile
-Makefile.in
aclocal.m4
autom4te.cache/
compile
@@ -20,7 +19,6 @@ config.guess
config.log
config.status
config.sub
-configure
depcomp
install-sh
libtool
diff --git a/Makefile.in b/Makefile.in
@@ -0,0 +1,49 @@
+# Build the program in the local tree
+.PHONY: all
+all:
+ $(NINJA) -C $(mesonbuilddir)
+
+# Install the program
+.PHONY: install
+install: all
+ $(MESON) install -C $(mesonbuilddir)
+
+# Remove files created during 'all'
+.PHONY: clean
+clean:
+ $(NINJA) -C $(mesonbuilddir) -t clean
+
+# Remove files created during 'install'
+.PHONY: uninstall
+uninstall:
+ $(NINJA) uninstall -C $(mesonbuilddir)
+
+# Make tarball
+.PHONY: dist
+dist:
+ $(MESON) dist -C $(mesonbuilddir) --no-tests --formats gztar
+
+# Make doxygen
+.PHONY: doxygen
+doxygen:
+ $(NINJA) -C $(mesonbuilddir) doxygen
+
+# Run tests
+.PHONY: check
+check:
+ $(MESON) test -C $(mesonbuilddir)
+
+.PHONY: installcheck
+installcheck:
+ $(MESON) test -C $(mesonbuilddir) --suite=installcheck
+
+.PHONY: integrationtests
+integrationtests:
+ $(MESON) test -C $(mesonbuilddir) --suite=integrationtests
+
+format:
+ $(MESON) fmt -i -r .
+ #find ./src -name "*.[h,c]" | uncrustify -l c -c contrib/conf/uncrustify.cfg -F - --replace --no-backup
+
+Makefile: Makefile.in
+ ./config.status
diff --git a/bootstrap b/bootstrap
@@ -15,10 +15,4 @@ existence()
command -v "$1" >/dev/null 2>&1
}
-if existence libtool || existence libtoolize || existence glibtoolize; then
- autoreconf -if
- . "contrib/pogen.sh"
-else
- echo "*** No libtoolize (libtool) or libtool found, please install it ***" >&2;
- exit 1
-fi
+. "contrib/pogen.sh"
diff --git a/configure b/configure
@@ -0,0 +1,255 @@
+#!/bin/sh
+
+pkg_name="anastasis"
+pkg_default_features=""
+pkg_optional_features="coverage logging only-doc install-rpath"
+pkg_optional_dependencies=""
+
+# DO NOT EDIT BELOW THIS LINE
+standard_dirs="prefix exec_prefix bindir sbindir libexecdir sysconfdir sharedstatedir localstatedir runstatedir libdir includedir oldincludedir datarootdir datadir infodir localedir mandir docdir htmldir dvidir pdfdir psdir srcdir mesonbuilddir"
+standard_utils="AR AS BISON CC CXX CPP FLEX INSTALL LD LDCONFIG LEX MAKE MAKEINFO RANLIB TEXI2DVI YACC CHGRP CHMOD CHOWN MKNOD RM NINJA MESON"
+standard_flags="ARFLAGS BISONFLAGS CFLAGS CXXFLAGS CPPFLAGS FLEXFLAGS INSTALLFLAGS LDFLAGS LDCONFIGFLAGS LFLAGS MAKEFLAGS MAKEINFOFLAGS RANLIBFLAGS TEXI2DVIFLAGS YACCFLAGS CHGRPFLAGS CHMODFLAGS CHOWNFLAGS MKNODFLAGS"
+standard_vars="INSTALL_DATA INSTALL_PROGRAM INSTALL_SCRIPT"
+generated_comment="# This file was generated by configure. DO NOT edit it directly."
+
+# Save arguments
+cat > config.status <<EOF
+#!/bin/sh
+$generated_comment
+$0 $*
+EOF
+chmod 755 config.status
+
+# Parse arguments
+oldifs="$IFS"
+while [ "$#" -gt "0" ]; do
+ arg="$1"
+ shift
+ argsave="$@"
+
+ IFS="="
+ set -- $arg
+ IFS="$oldifs"
+ arg="$1"
+ shift
+ argparam="$@"
+
+ case "$arg" in
+ --help|-h)
+ cat <<-EOF
+ Usage: $0 [options...]
+ General options:
+
+ <variable>=<value> Overrides default utils and flags, e.g. CC=gcc
+ EOF
+ echo ""
+ echo "Directory variables:"
+ for sdir in $standard_dirs; do
+ echo "--$sdir=<directory>"
+ done
+ echo ""
+ echo "Options specific to $pkg_name:"
+ for feat in $pkg_optional_features; do
+ echo "--enable-$feat[=arg]"
+ done
+ for feat in $pkg_default_features; do
+ echo "--disable-$feat"
+ done
+ for dep in $pkg_optional_dependencies; do
+ echo "--with-$dep"
+ done
+
+ echo
+ echo Other options will be ignored. Please see the README for additional information.
+ exit 0
+ ;;
+ --enable-*)
+ for feat in $pkg_optional_features $pkg_default_features; do
+ ft=$(echo $feat | tr - _)
+ if [ "--enable-$feat" = "$arg" ] && [ -z "$argparam" ]; then
+ eval "enable_$ft=true"
+ elif [ "--enable-$feat" = "$arg" ]; then
+ if [ "$argparam" = "yes" ]; then
+ eval "enable_$ft=\"true\""
+ else
+ eval "enable_$ft=\"$argparam\""
+ fi
+ fi
+ done
+ ;;
+ --disable-*)
+ argsave="--enable-${arg#--disable-}=false $argsave"
+ ;;
+ --with-*)
+ for dep in $pkg_optional_dependencies; do
+ if [ "--with-$dep" = "$arg" ] && [ -z "$argparam" ]; then
+ eval "with_$dep=yes"
+ elif [ "--with-$dep" = "$arg" ]; then
+ eval "with_$dep=\"$argparam\""
+ fi
+ done
+ ;;
+ --without-*)
+ argsave="--with-${arg#--without-}=no $argsave"
+ ;;
+ --*)
+ for dir in $standard_dirs; do
+ [ "--$dir" = "$arg" ] && eval "var_$dir=\"$argparam\""
+ done
+ ;;
+ *)
+ for flag in $standard_utils $standard_flags standard_vars; do
+ [ "$flag" = "$arg" ] && eval "$flag=\"$argparam\""
+ done
+ ;;
+ esac
+
+ set -- $argsave
+done
+
+# Set default values
+for util in $standard_utils; do
+ case "$util" in
+ CPP) eval "$util=\"\${${util}:-\\\$(CC) -E}\"" ;;
+ CXX) eval "$util=\"\${${util}:-g++}\"" ;;
+ RM) eval "$util=\"\${${util}:-rm -f}\"" ;;
+ MESON) eval "$util=\"\${${util}:-meson}\"" ;;
+ NINJA) eval "$util=\"\${${util}:-ninja}\"" ;;
+ *) eval "$util=\"\${${util}:-${util}}\"" ;;
+ esac
+done
+for feat in $pkg_optional_features; do
+ ft=$(echo $feat | tr - _)
+ eval "enable_$ft=\${enable_$ft:-false}"
+done
+for feat in $pkg_default_features; do
+ eval "enable_$feat=\${enable_$feat:-true}"
+done
+for feat in $pkg_optional_dependencies; do
+ eval "with_$feat=\${with_$feat:-no}"
+done
+
+# Find source files
+if [ -z "$var_srcdir" ]; then
+ [ -f ../Makefile.in ] && var_srcdir=..
+ [ -f ./Makefile.in ] && var_srcdir=.
+fi
+if [ -z "$var_srcdir" ]; then
+ echo "Source files not found. Please specify a directory using --srcdir=..." >&2
+ exit 1
+fi
+
+# Write Makefile
+cat > Makefile <<EOF
+$generated_comment
+SHELL = /bin/sh
+VPATH = ${var_srcdir}
+
+mesonbuilddir = ${var_mesonbuilddir:-build}
+srcdir = ${var_srcdir}
+prefix = ${var_prefix:-/usr/local}
+exec_prefix = ${var_exec_prefix:-\$(prefix)}
+bindir = ${var_bindir:-\$(exec_prefix)/bin}
+sbindir = ${var_sbindir:-\$(exec_prefix)/sbin}
+libexecdir = ${var_libexecdir:-\$(exec_prefix)/libexec}
+datarootdir = ${var_datarootdir:-\$(prefix)/share}
+datadir = ${var_datadir:-\$(datarootdir)}
+sysconfdir = ${var_sysconfdir:-\$(prefix)/etc}
+sharedstatedir = ${var_sharedstatedir:-\$(prefix)/com}
+localstatedir = ${var_localstatedir:-\$(prefix)/var}
+runstatedir = ${var_runstatedir:-\$(localstatedir)/run}
+includedir = ${var_includedir:-\$(prefix)/include}
+oldincludedir = ${var_oldincludedir:-/usr/include}
+docdir = ${var_docdir:-\$(datarootdir)/doc/"$pkg_name"}
+infodir = ${var_infodir:-\$(datarootdir)/info}
+htmldir = ${var_htmldir:-\$(docdir)}
+dvidir = ${var_dvidir:-\$(docdir)}
+pdfdir = ${var_pdfdir:-\$(docdir)}
+psdir = ${var_psdir:-\$(docdir)}
+libdir = ${var_libdir:-\$(exec_prefix)/lib}
+lispdir = ${var_lispdir:-\$(datarootdir)/emacs/site-lisp}
+localedir = ${var_localedir:-\$(datarootdir)/locale}
+mandir = ${var_mandir:-\$(datarootdir)/man}
+manext = .1
+EOF
+
+if [ -d ${var_mesonbuilddir:-build} ]; then
+ echo "${var_mesonbuilddir:-build} already exists, deleting with"
+ $RM -r ${var_mesonbuilddir:-build} || exit 1
+fi
+
+for var in $standard_utils $standard_flags $standard_vars; do
+ eval "echo \"${var} = \$${var}\" >> Makefile"
+done
+echo >> Makefile
+
+mesonfeatopts=""
+for feat in $pkg_optional_features $pkg_default_features; do
+ ft=$(echo $feat | tr - _)
+ eval "echo \"enable_$ft=\${enable_$ft}\" >> Makefile"
+ if [ "coverage" = $feat ]; then
+ mfeat="b_$feat"
+ else
+ mfeat=$feat
+ fi
+ eval "mesonfeatopts=\"$mesonfeatopts -D$mfeat=\${enable_$ft}\""
+done
+for dep in $pkg_optional_dependencies; do
+ eval "echo \"with_$dep=\${with_$dep}\" >> Makefile"
+done
+echo >> Makefile
+
+cat "${var_srcdir}/Makefile.in" >> Makefile
+
+# Create default targets, if not already present
+default_target() {
+ grep "^$1:" Makefile >/dev/null && return
+ echo ".PHONY: $1" >> Makefile
+ echo "$1: $2" >> Makefile
+ cat >> Makefile
+ echo >> Makefile
+}
+
+#default_target Makefile <<EOF
+# ./config.status
+#EOF
+for format in html dvi pdf ps; do
+ default_target "$format" </dev/null
+ default_target "install-$format" "$format" </dev/null
+done
+default_target check </dev/null
+default_target mostlyclean clean </dev/null
+default_target distclean clean <<EOF
+ \$(RM) Makefile config.status
+EOF
+default_target maintainer-clean distclean </dev/null
+default_target install-strip <<EOF
+ \$(MAKE) INSTALL_PROGRAM='\$(INSTALL_PROGRAM) -s' \\
+ INSTALL_SCRIPT='\$(INSTALL_SCRIPT)' install
+EOF
+
+mesondiropts=""
+for dr in $standard_dirs; do
+ if [ $dr = "srcdir" ]; then
+ continue
+ fi
+ if [ $dr = "mesonbuilddir" ]; then
+ continue
+ fi
+ eval "vn=\${var_$dr}"
+ if [ ! -z $vn ]; then
+ eval "mesondiropts=\"$mesondiropts -D$dr=\${var_$dr}\""
+ fi
+done
+
+${MESON} setup \
+ -Ddefault_library=shared \
+ $mesondiropts \
+ $mesonfeatopts \
+ ${var_mesonbuilddir:-build} \
+ ${var_srcdir} || exit 1
+
+# Done
+echo "Package $pkg_name configured successfully."
+echo "Run 'make' to build and 'make install' to install the package"
+
diff --git a/contrib/meson.build b/contrib/meson.build
@@ -0,0 +1,47 @@
+# This file is in the public domain
+
+install_data(
+ 'this_stays_private.glade',
+ 'anastasis_gtk_add_provider.glade',
+ 'anastasis_gtk_auth_add_email.glade',
+ 'anastasis_gtk_auth_add_iban.glade',
+ 'anastasis_gtk_auth_add_post.glade',
+ 'anastasis_gtk_auth_add_question.glade',
+ 'anastasis_gtk_auth_add_sms.glade',
+ 'anastasis_gtk_auth_add_totp.glade',
+ 'anastasis_gtk_auth_add_video.glade',
+ 'anastasis_gtk_challenge_code.glade',
+ 'anastasis_gtk_challenge_iban.glade',
+ 'anastasis_gtk_challenge_question.glade',
+ 'anastasis_gtk_challenge_template.glade',
+ 'anastasis_gtk_challenge_totp.glade',
+ 'anastasis_gtk_deny_singlefactor.glade',
+ 'anastasis_gtk_edit_providers.glade',
+ 'anastasis_gtk_edit_policy.glade',
+ 'anastasis_gtk_main_window.glade',
+ 'anastasis_gtk_open_file_dialog.glade',
+ 'anastasis_gtk_open_secret_dialog.glade',
+ 'anastasis_gtk_policy_template.glade',
+ 'anastasis_gtk_save_file_dialog.glade',
+ 'anastasis_gtk_save_secret_dialog.glade',
+ 'anastasis_gtk_user_sure.glade',
+ 'anastasis_gtk_warn_multifactor.glade',
+ 'bandiera_stelle.png',
+ 'checkmark.svgz',
+ 'freeotp.png',
+ 'logo.png',
+ 'home_work_black_24dp.svg',
+ 'ngi_ledger.png',
+ 'noun_blindfold_3574196.svg',
+ 'outline_contact_support_black_24dp.png',
+ 'outline_email_black_24dp.png',
+ 'outline_home_work_black_24dp.png',
+ 'outline_iban_24dp.png',
+ 'outline_stay_current_portrait_black_24dp.png',
+ 'outline_totp_24dp.png',
+ 'outline_video_camera_front_black_24dp.png',
+ 'qr_dummy.png',
+ 'video_camera_front_black_24dp.svg',
+ install_dir: pkgdatadir)
+
+
diff --git a/doc/meson.build b/doc/meson.build
@@ -0,0 +1,2 @@
+# This file is in the public domain
+install_man('anastasis-gtk.1')
diff --git a/flake.lock b/flake.lock
@@ -0,0 +1,1654 @@
+{
+ "nodes": {
+ "anastasis": {
+ "inputs": {
+ "donau": "donau",
+ "exchange": "exchange_2",
+ "gnunet": "gnunet_4",
+ "merchant": "merchant",
+ "nixpkgs": "nixpkgs_16",
+ "systems": "systems_16"
+ },
+ "locked": {
+ "lastModified": 1776947250,
+ "narHash": "sha256-+9oNyc19q7ZBva4E+g+wyx68ZRO6HeoXyhOTNRB3JMQ=",
+ "ref": "refs/heads/master",
+ "rev": "c55bf5de869065cafbd4b05edcd16980f7f1abae",
+ "revCount": 532,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/anastasis"
+ },
+ "original": {
+ "rev": "c55bf5de869065cafbd4b05edcd16980f7f1abae",
+ "type": "git",
+ "url": "https://git.gnunet.org/anastasis"
+ }
+ },
+ "donau": {
+ "inputs": {
+ "exchange": "exchange",
+ "gnunet": "gnunet_2",
+ "nixpkgs": "nixpkgs_4",
+ "systems": "systems_4"
+ },
+ "locked": {
+ "lastModified": 1776068074,
+ "narHash": "sha256-/UG1yoOAak34+mZ/fTB8+/FMMEaj4enPn+IxOV8R/4A=",
+ "ref": "refs/heads/master",
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "revCount": 1050,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ },
+ "original": {
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ }
+ },
+ "donau_2": {
+ "inputs": {
+ "exchange": "exchange_3",
+ "gnunet": "gnunet_6",
+ "nixpkgs": "nixpkgs_11",
+ "systems": "systems_11"
+ },
+ "locked": {
+ "lastModified": 1776068074,
+ "narHash": "sha256-/UG1yoOAak34+mZ/fTB8+/FMMEaj4enPn+IxOV8R/4A=",
+ "ref": "refs/heads/master",
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "revCount": 1050,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ },
+ "original": {
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ }
+ },
+ "donau_3": {
+ "inputs": {
+ "exchange": "exchange_5",
+ "gnunet": "gnunet_10",
+ "nixpkgs": "nixpkgs_20",
+ "systems": "systems_20"
+ },
+ "locked": {
+ "lastModified": 1776068074,
+ "narHash": "sha256-/UG1yoOAak34+mZ/fTB8+/FMMEaj4enPn+IxOV8R/4A=",
+ "ref": "refs/heads/master",
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "revCount": 1050,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ },
+ "original": {
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ }
+ },
+ "donau_4": {
+ "inputs": {
+ "exchange": "exchange_7",
+ "gnunet": "gnunet_14",
+ "nixpkgs": "nixpkgs_27",
+ "systems": "systems_27"
+ },
+ "locked": {
+ "lastModified": 1776068074,
+ "narHash": "sha256-/UG1yoOAak34+mZ/fTB8+/FMMEaj4enPn+IxOV8R/4A=",
+ "ref": "refs/heads/master",
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "revCount": 1050,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ },
+ "original": {
+ "rev": "4f609168fe263891f134eff01f86288066acdd81",
+ "type": "git",
+ "url": "https://git.gnunet.org/donau"
+ }
+ },
+ "exchange": {
+ "inputs": {
+ "gnunet": "gnunet",
+ "nixpkgs": "nixpkgs_2",
+ "systems": "systems_2"
+ },
+ "locked": {
+ "lastModified": 1776020637,
+ "narHash": "sha256-U/KHaAaE/JrlS3RYbRRiRRe0ur2JACkKysevCrzCXYY=",
+ "ref": "refs/heads/master",
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "revCount": 9931,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_2": {
+ "inputs": {
+ "gnunet": "gnunet_3",
+ "nixpkgs": "nixpkgs_6",
+ "systems": "systems_6"
+ },
+ "locked": {
+ "lastModified": 1776021477,
+ "narHash": "sha256-V6qYPCNgaalQi6tRkDZ+Per3PPifm1Ze2pShV6LGomg=",
+ "ref": "refs/heads/master",
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "revCount": 9932,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_3": {
+ "inputs": {
+ "gnunet": "gnunet_5",
+ "nixpkgs": "nixpkgs_9",
+ "systems": "systems_9"
+ },
+ "locked": {
+ "lastModified": 1776020637,
+ "narHash": "sha256-U/KHaAaE/JrlS3RYbRRiRRe0ur2JACkKysevCrzCXYY=",
+ "ref": "refs/heads/master",
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "revCount": 9931,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_4": {
+ "inputs": {
+ "gnunet": "gnunet_7",
+ "nixpkgs": "nixpkgs_13",
+ "systems": "systems_13"
+ },
+ "locked": {
+ "lastModified": 1776021477,
+ "narHash": "sha256-V6qYPCNgaalQi6tRkDZ+Per3PPifm1Ze2pShV6LGomg=",
+ "ref": "refs/heads/master",
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "revCount": 9932,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_5": {
+ "inputs": {
+ "gnunet": "gnunet_9",
+ "nixpkgs": "nixpkgs_18",
+ "systems": "systems_18"
+ },
+ "locked": {
+ "lastModified": 1776020637,
+ "narHash": "sha256-U/KHaAaE/JrlS3RYbRRiRRe0ur2JACkKysevCrzCXYY=",
+ "ref": "refs/heads/master",
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "revCount": 9931,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_6": {
+ "inputs": {
+ "gnunet": "gnunet_11",
+ "nixpkgs": "nixpkgs_22",
+ "systems": "systems_22"
+ },
+ "locked": {
+ "lastModified": 1776021477,
+ "narHash": "sha256-V6qYPCNgaalQi6tRkDZ+Per3PPifm1Ze2pShV6LGomg=",
+ "ref": "refs/heads/master",
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "revCount": 9932,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_7": {
+ "inputs": {
+ "gnunet": "gnunet_13",
+ "nixpkgs": "nixpkgs_25",
+ "systems": "systems_25"
+ },
+ "locked": {
+ "lastModified": 1776020637,
+ "narHash": "sha256-U/KHaAaE/JrlS3RYbRRiRRe0ur2JACkKysevCrzCXYY=",
+ "ref": "refs/heads/master",
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "revCount": 9931,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "1b474b461597d11382e4e036520259a96f254e9b",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "exchange_8": {
+ "inputs": {
+ "gnunet": "gnunet_15",
+ "nixpkgs": "nixpkgs_29",
+ "systems": "systems_29"
+ },
+ "locked": {
+ "lastModified": 1776021477,
+ "narHash": "sha256-V6qYPCNgaalQi6tRkDZ+Per3PPifm1Ze2pShV6LGomg=",
+ "ref": "refs/heads/master",
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "revCount": 9932,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ },
+ "original": {
+ "rev": "92da4e81006404494f6443781c8f55249e723847",
+ "type": "git",
+ "url": "https://git.gnunet.org/exchange"
+ }
+ },
+ "gnunet": {
+ "inputs": {
+ "nixpkgs": "nixpkgs",
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_10": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_19",
+ "systems": "systems_19"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_11": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_21",
+ "systems": "systems_21"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_12": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_23",
+ "systems": "systems_23"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_13": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_24",
+ "systems": "systems_24"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_14": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_26",
+ "systems": "systems_26"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_15": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_28",
+ "systems": "systems_28"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_16": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_30",
+ "systems": "systems_30"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_2": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_3",
+ "systems": "systems_3"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_3": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_5",
+ "systems": "systems_5"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_4": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_7",
+ "systems": "systems_7"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_5": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_8",
+ "systems": "systems_8"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_6": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_10",
+ "systems": "systems_10"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_7": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_12",
+ "systems": "systems_12"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_8": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_14",
+ "systems": "systems_14"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "gnunet_9": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_17",
+ "systems": "systems_17"
+ },
+ "locked": {
+ "lastModified": 1774899416,
+ "narHash": "sha256-YcGma1gX/t76xDv9DW71nKkWFhzXYz3NkN/WEceHbZM=",
+ "ref": "refs/heads/master",
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "revCount": 33194,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ },
+ "original": {
+ "rev": "7c6b613e37e301b0e81fb94af5878d00c98e5b75",
+ "type": "git",
+ "url": "https://git.gnunet.org/gnunet"
+ }
+ },
+ "merchant": {
+ "inputs": {
+ "donau": "donau_2",
+ "exchange": "exchange_4",
+ "gnunet": "gnunet_8",
+ "nixpkgs": "nixpkgs_15",
+ "systems": "systems_15"
+ },
+ "locked": {
+ "lastModified": 1776070816,
+ "narHash": "sha256-R+a90LanaprK2S4XzUXyW5tAUXOf+pVD7ljCfvulgAM=",
+ "ref": "refs/heads/master",
+ "rev": "b174138726171601b666fff346762502be5150a1",
+ "revCount": 5567,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/merchant"
+ },
+ "original": {
+ "rev": "b174138726171601b666fff346762502be5150a1",
+ "type": "git",
+ "url": "https://git.gnunet.org/merchant"
+ }
+ },
+ "merchant_2": {
+ "inputs": {
+ "donau": "donau_4",
+ "exchange": "exchange_8",
+ "gnunet": "gnunet_16",
+ "nixpkgs": "nixpkgs_31",
+ "systems": "systems_31"
+ },
+ "locked": {
+ "lastModified": 1776070816,
+ "narHash": "sha256-R+a90LanaprK2S4XzUXyW5tAUXOf+pVD7ljCfvulgAM=",
+ "ref": "refs/heads/master",
+ "rev": "b174138726171601b666fff346762502be5150a1",
+ "revCount": 5567,
+ "submodules": true,
+ "type": "git",
+ "url": "https://git.gnunet.org/merchant"
+ },
+ "original": {
+ "rev": "b174138726171601b666fff346762502be5150a1",
+ "type": "git",
+ "url": "https://git.gnunet.org/merchant"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_10": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_11": {
+ "locked": {
+ "lastModified": 1775825553,
+ "narHash": "sha256-LH0FGBWngFpvqXYfN1eks+L5n3aXy1ALTTRRhxP0HGA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "ca62ee54d15571e3122309abb6740578906bcdf7",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_12": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_13": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_14": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_15": {
+ "locked": {
+ "lastModified": 1775730577,
+ "narHash": "sha256-5i3MKmxBFQP9/wp3QyFWyS7DqURq/M4T8gr1JSbyygI=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "0d5a853f7004a5fc57b61a97ccb02832f8e7ed9d",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_16": {
+ "locked": {
+ "lastModified": 1776360938,
+ "narHash": "sha256-Tq/T/Us82tBQIRuyuZyWR1EMVJ0EStmk/u8qQgsKlVM=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "67664cad2361605c8fce9712d9ce6a8e026d2380",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_17": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_18": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_19": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_20": {
+ "locked": {
+ "lastModified": 1775825553,
+ "narHash": "sha256-LH0FGBWngFpvqXYfN1eks+L5n3aXy1ALTTRRhxP0HGA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "ca62ee54d15571e3122309abb6740578906bcdf7",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_21": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_22": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_23": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_24": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_25": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_26": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_27": {
+ "locked": {
+ "lastModified": 1775825553,
+ "narHash": "sha256-LH0FGBWngFpvqXYfN1eks+L5n3aXy1ALTTRRhxP0HGA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "ca62ee54d15571e3122309abb6740578906bcdf7",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_28": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_29": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_3": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_30": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_31": {
+ "locked": {
+ "lastModified": 1775730577,
+ "narHash": "sha256-5i3MKmxBFQP9/wp3QyFWyS7DqURq/M4T8gr1JSbyygI=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "0d5a853f7004a5fc57b61a97ccb02832f8e7ed9d",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_32": {
+ "locked": {
+ "lastModified": 1776946615,
+ "narHash": "sha256-Q4SmvLr7PxHm9BLCcsKf4iH3IzIZgqFxV/bk5j4H6AM=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "6ea81a59ced133851d02042d2ba8c2911fd54546",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_4": {
+ "locked": {
+ "lastModified": 1775825553,
+ "narHash": "sha256-LH0FGBWngFpvqXYfN1eks+L5n3aXy1ALTTRRhxP0HGA=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "ca62ee54d15571e3122309abb6740578906bcdf7",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_5": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_6": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_7": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_8": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "nixpkgs_9": {
+ "locked": {
+ "lastModified": 1774799055,
+ "narHash": "sha256-Tsq9BCz0q47ej1uFF39m4tuhcwru/ls6vCCJzutEpaw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "107cba9eb4a8d8c9f8e9e61266d78d340867913a",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "release-25.11",
+ "type": "indirect"
+ }
+ },
+ "root": {
+ "inputs": {
+ "anastasis": "anastasis",
+ "donau": "donau_3",
+ "exchange": "exchange_6",
+ "gnunet": "gnunet_12",
+ "merchant": "merchant_2",
+ "nixpkgs": "nixpkgs_32",
+ "systems": "systems_32"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_10": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_11": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_12": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_13": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_14": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_15": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_16": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_17": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_18": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_19": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_2": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_20": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_21": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_22": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_23": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_24": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_25": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_26": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_27": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_28": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_29": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_3": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_30": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_31": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_32": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_4": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_5": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_6": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_7": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_8": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "systems_9": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
@@ -0,0 +1,135 @@
+# This is a nix flake. To use it, you need nix (with flake support) installed.
+# If you do not have nix and do not intend to use it, you can ignore this file.
+# Why should you use it? Using this flake will allow you to enter a developer shell
+# which has all necessary packages for this repository already installed.
+# The shell will allow you to code against the specific revisions of the dependencies
+# pinned in this file.
+# This is useful when git HEAD of your dependencies already contains breaking changes
+# you should not (yet) code against.
+# OTOH, if you should code against a newer, not yet released revision, you can specify
+# this revision in this file.
+# You can use this file in three ways:
+# 1. Build: $ nix build
+# this will build the package (it runs make for you in an environment with the dependencies installed)
+# 2. Develop: $ nix develop
+# This will drop you inside a shell in which you can develop and compile (and test) your code.
+# It even starts and sets up the test database for you.
+# 3. Use this repository in a new project
+# Should you create a new project that depends on this project you are in luck. You can create a flake.nix
+# in your repository and include this packages as a dependency just like the dependencies of this package are
+# included here.
+
+{
+ inputs = {
+ nixpkgs.url = "nixpkgs/release-25.11";
+ systems.url = "github:nix-systems/default";
+ gnunet.url = "git+https://git.gnunet.org/gnunet?rev=7c6b613e37e301b0e81fb94af5878d00c98e5b75";
+ exchange.url = "git+https://git.gnunet.org/exchange?rev=92da4e81006404494f6443781c8f55249e723847";
+ merchant.url = "git+https://git.gnunet.org/merchant?rev=b174138726171601b666fff346762502be5150a1";
+ donau.url = "git+https://git.gnunet.org/donau?rev=4f609168fe263891f134eff01f86288066acdd81";
+ anastasis.url = "git+https://git.gnunet.org/anastasis?rev=c55bf5de869065cafbd4b05edcd16980f7f1abae";
+ self.submodules = true;
+ };
+
+ outputs = { self, nixpkgs, gnunet, exchange, donau, merchant, anastasis, systems, ... } @ inputs:
+ let
+ supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
+ forEachSystem = nixpkgs.lib.genAttrs supportedSystems;
+ nixpkgsFor = forEachSystem (system: import nixpkgs { inherit system; });
+ in
+ {
+ # This defines (installable) package derivations
+ # For use in flakes that use this flake as input in order
+ # to specify/use this package from git as a dependency
+ packages = forEachSystem (system:
+ let
+ pkgs = nixpkgsFor.${system};
+ gnunetpkgs = gnunet.packages.${system};
+ exchangepkgs = exchange.packages.${system};
+ donaupkgs = donau.packages.${system};
+ merchantpkgs = merchant.packages.${system};
+ anastasispkgs = anastasis.packages.${system};
+ in {
+ anastasisgtk = pkgs.stdenv.mkDerivation {
+ name = "anastasis-gtk";
+ src = ./.;
+ nativeBuildInputs = [
+ pkgs.gnumake
+ pkgs.meson
+ pkgs.ninja
+ pkgs.pkg-config
+ ];
+ buildInputs = [
+ pkgs.libtool
+ pkgs.jansson
+ pkgs.git
+ pkgs.gettext
+ pkgs.libmicrohttpd
+ pkgs.curlWithGnuTls
+ pkgs.qrencode
+ pkgs.libharu
+ pkgs.glade
+ pkgs.glib
+ pkgs.gtk3
+ gnunetpkgs.gnunet
+ exchangepkgs.exchange
+ donaupkgs.donau
+ merchantpkgs.merchant
+ anastasispkgs.anastasis
+ ];
+ preConfigure = ''
+ patchShebangs --build contrib/check-prebuilt
+ ./bootstrap
+ '';
+ };
+ }
+ );
+ defaultPackage = forEachSystem (system: self.packages.${system}.anastasis);
+ # This defines a development shell in which you can compile
+ # (and use) exchange
+ devShells = forEachSystem
+ (system:
+ let
+ pkgs = nixpkgsFor.${system};
+ gnunetpkgs = gnunet.packages.${system};
+ exchangepkgs = exchange.packages.${system};
+ donaupkgs = donau.packages.${system};
+ merchantpkgs = merchant.packages.${system};
+ anastasispkgs = anastasis.packages.${system};
+ in
+ {
+ default = pkgs.mkShell {
+ packages = [
+ pkgs.gcc
+ pkgs.meson
+ pkgs.ninja
+ pkgs.gnumake
+ pkgs.pkg-config
+ pkgs.libtool
+ pkgs.git
+ pkgs.gettext
+ pkgs.curlWithGnuTls
+ gnunetpkgs.gnunet
+ pkgs.codespell
+ pkgs.clang-tools
+ pkgs.uncrustify
+ pkgs.qrencode
+ pkgs.libharu
+ pkgs.glade
+ pkgs.glib
+ pkgs.gtk3
+ exchangepkgs.exchange
+ donaupkgs.donau
+ merchantpkgs.merchant
+ anastasispkgs.anastasis
+ ];
+
+ shellHook = ''
+ echo "anastasis-gtk environment loaded."
+ export CC=gcc
+ export CFLAGS="-O"
+ '';
+ };
+ });
+ };
+}
diff --git a/meson.build b/meson.build
@@ -0,0 +1,307 @@
+project(
+ 'anastasis-gtk',
+ 'c',
+ license: 'AGPLv3',
+ meson_version: '>=1.1.0',
+ version: '0.7.0',
+)
+
+cc = meson.get_compiler('c')
+incdir = include_directories('.', 'src/include')
+
+# Used to populate gnunet_private_config.h
+private_config = configuration_data()
+
+
+plugindir = get_option('libdir') / 'anastasis-gtk'
+pkgdatadir = get_option('datadir') / 'anastasis-gtk'
+pkgcfgdir = pkgdatadir / 'config.d'
+docdir = get_option('datadir') / 'doc' / 'anastasis-gtk'
+
+if get_option('install-rpath')
+ rpath_option = get_option('prefix') / get_option('libdir')
+else
+ rpath_option = ''
+endif
+
+install_emptydir(docdir)
+install_data('README', 'COPYING', install_dir: docdir)
+
+gnunet_user = false
+dpkg_architecture_bin = find_program(
+ 'dpkg-architecture',
+ '/usr/bin/dpkg-architecture',
+ required: false,
+)
+if dpkg_architecture_bin.found()
+ private_config.set(
+ 'MULTIARCH',
+ dpkg_architecture_bin.full_path() + ' -qDEB_HOST_MULTIARCH',
+ )
+endif
+
+TALER_PLUGIN_LDFLAGS = [
+ '-export-dynamic',
+ '-avoid-version',
+ '-module',
+ '--no-undefined',
+]
+
+cdata = configuration_data()
+if not get_option('only-doc')
+ add_project_arguments(
+ '-Wall',
+ '-Wno-address-of-packed-member',
+ language: 'c',
+ )
+ taler_lib_ldflags = '-export-dynamic -no-undefined'
+
+ check_headers = ['errno.h', 'stdio.h', 'unistd.h', 'locale.h', 'sys/stat.h', 'sys/types.h', 'langinfo.h', 'libintl.h', 'stddef.h', 'argz.h', 'sys/socket.h', 'netinet/in.h', 'stdarg.h']
+
+ foreach h : check_headers
+ if cc.check_header(h)
+ define = 'HAVE_' + h.underscorify().to_upper()
+ message(define)
+ private_config.set(define, 1)
+ endif
+ endforeach
+
+ if cc.has_function('getpwnam')
+ private_config.set('HAVE_GETPWNAM', 1)
+ endif
+ if cc.has_header_symbol('_stati64', 'sys/stat.h')
+ private_config.set('HAVE_DECL__STATI64', 1)
+ endif
+
+
+ # Gettext
+ i18n = import('i18n')
+
+ gettext_package = 'anastasis-gtk'
+ add_project_arguments('-DGETTEXT_PACKAGE=' + gettext_package, language: 'c')
+ add_project_arguments('-DENABLE_NLS=1', language: 'c')
+
+ magic_dep = dependency('magic', required: false)
+ if not magic_dep.found()
+ magic_dep = cc.find_library('magic', required: true)
+ endif
+ haru_dep = dependency('hpdf', required: false)
+ if not haru_dep.found()
+ haru_dep = cc.find_library('hpdf', required: false)
+ endif
+
+ qrencode_dep = dependency('qrencode', required: false)
+ if not qrencode_dep.found()
+ qrencode_dep = cc.find_library('qrencode', required: true)
+ endif
+
+ mhd_dep = dependency('libmicrohttpd', required: false)
+ if not mhd_dep.found()
+ mhd_dep = cc.find_library('microhttpd', required: true)
+ endif
+
+ json_dep = dependency('jansson', required: false)
+ if not json_dep.found()
+ json_dep = cc.find_library('jansson', required: true)
+ endif
+
+ gcrypt_dep = dependency('libgcrypt', required: false)
+ if not gcrypt_dep.found()
+ gcrypt_dep = cc.find_library('gcrypt', required: true)
+ endif
+
+ private_config.set_quoted('NEED_LIBGCRYPT_VERSION', '1.6.1')
+
+ anastasis_dep = dependency('anastasis', required: false)
+ if not anastasis_dep.found()
+ anastasis_dep = cc.find_library('anastasis', required: true)
+ endif
+
+ cc.has_header_symbol(
+ 'anastasis/anastasis_service.h',
+ 'ANASTASIS_get_config',
+ dependencies: [anastasis_dep],
+ required: true,
+ )
+
+ anastasisrest_dep = dependency('anastasisrest', required: false)
+ if not anastasisrest_dep.found()
+ anastasisrest_dep = cc.find_library('anastasisrest', required: true)
+ endif
+
+ anastasisredux_dep = dependency('anastasisredux', required: false)
+ if not anastasisredux_dep.found()
+ anastasisredux_dep = cc.find_library('anastasisredux', required: true)
+ endif
+
+ anastasisutil_dep = dependency('anastasisutil', required: false)
+ if not anastasisutil_dep.found()
+ anastasisutil_dep = cc.find_library('anastasisutil', required: true)
+ endif
+
+
+
+
+ gnunetutil_dep = dependency('gnunetutil', required: false)
+ if not gnunetutil_dep.found()
+ gnunetutil_dep = cc.find_library('gnunetutil', required: true)
+ endif
+
+ cc.has_header_symbol(
+ 'gnunet/gnunet_util_lib.h',
+ 'GNUNET_TIME_round_up',
+ dependencies: [gnunetutil_dep],
+ required: true,
+ )
+ gnunetjson_dep = dependency('gnunetjson', required: false)
+ if not gnunetjson_dep.found()
+ gnunetjson_dep = cc.find_library('gnunetjson', required: true)
+ endif
+ gnunetcurl_dep = dependency('gnunetcurl', required: false)
+ if not gnunetcurl_dep.found()
+ gnunetcurl_dep = cc.find_library('gnunetcurl', required: true)
+ endif
+ talerjson_dep = dependency('talerjson', required: false)
+ if not talerjson_dep.found()
+ talerjson_dep = cc.find_library('talerjson', required: true)
+ endif
+ cc.has_header_symbol(
+ 'taler/taler_json_lib.h',
+ 'TALER_JSON_currency_specs_to_json',
+ required: true,
+ dependencies: [talerjson_dep],
+ )
+ private_config.set10('HAVE_TALERJSON', talerjson_dep.found())
+
+ talerutil_dep = dependency('talerutil', required: false)
+ if not talerutil_dep.found()
+ talerutil_dep = cc.find_library('talerutil', required: true)
+ endif
+ cc.has_header_symbol(
+ 'taler/taler_util.h',
+ 'TALER_merchant_instance_auth_hash_with_salt',
+ required: true,
+ dependencies: [talerutil_dep],
+ )
+ private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
+
+
+ gtk_dep = dependency('gtk+-3.0', required: false)
+ if not gtk_dep.found()
+ gtk_dep = cc.find_library('gtk+-3.0', required: true)
+ endif
+
+ glade_dep = dependency('gladeui-2.0', required: false)
+ if not glade_dep.found()
+ glade_dep = cc.find_library('glade-2.0', required: true)
+ endif
+
+ curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
+ if not curl_dep.found()
+ curl_dep = cc.find_library('curl', required: true)
+ curl_version_check = '''#include <curl/curl.h>
+ int main(int argc, char **argv) {
+ #if LIBCURL_VERSION_NUM < 0x073400
+ #error "cURL version >= 7.34.0 required"
+ #endif
+ return 0;
+ }
+ '''
+ if not cc.compiles(
+ curl_version_check,
+ name: 'cURL version check',
+ dependencies: curl_dep,
+ )
+ error('cURL version >=7.34.0 required')
+ endif
+ endif
+
+ logging_opt = get_option('logging')
+ logging_verbosity = 0
+
+ if logging_opt == 'yes'
+ logging_verbosity = 1
+ endif
+ if logging_opt == 'no'
+ add_project_arguments('-DGNUNET_CULL_LOGGING=1', language: 'c')
+ endif
+ if logging_opt == 'verbose'
+ logging_verbosity = 2
+ endif
+ if logging_opt == 'veryverbose'
+ logging_verbosity = 3
+ endif
+
+ #add_project_arguments('-DGNUNET_EXTRA_LOGGING=@0@'.format(logging_verbosity), language: 'c')
+
+
+ # todo gcov has meson builtin
+
+ # Used to populate configuration file and script templates
+
+
+ libltversions = [
+ ['libanastasisgtkutil', '0:0:0'],
+ ]
+
+ solibversions = {}
+
+ foreach libversion : libltversions
+ ltversion = libversion[1].split(':')
+ current = ltversion[0].to_int()
+ revision = ltversion[1].to_int()
+ age = ltversion[2].to_int()
+ soversion_str = '@0@'.format(current - age)
+ ltversion_str = '@0@.@1@.@2@'.format(current - age, age, revision)
+ solibversions = solibversions + {
+ libversion[0]: {
+ 'soversion': soversion_str,
+ 'version': ltversion_str,
+ },
+ }
+ endforeach
+
+ #private_config.set_quoted('PACKAGE', meson.project_name())
+ add_project_arguments('-DPACKAGE="@0@"'.format(meson.project_name()), language: 'c')
+ add_project_arguments('-DPACKAGE_NAME="@0@"'.format(meson.project_name()), language: 'c')
+ private_config.set_quoted('PACKAGE_VERSION', meson.project_version())
+ # Compatibility. Used in source.
+ private_config.set_quoted('VERSION', meson.project_version())
+ private_config.set_quoted('VCS_VERSION', 'mesonbuild')
+ private_config.set_quoted('PACKAGE_BUGREPORT', 'taler@gnu.org')
+ configure_file(output: 'anastasis_gtk_config.h', configuration: private_config)
+ configuration_inc = include_directories('.')
+
+ cdata.merge_from(private_config)
+ add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
+
+ pkg = import('pkgconfig')
+ subdir('contrib')
+ subdir('src')
+ if not get_option('disable-doc')
+ subdir('doc')
+ endif
+
+ taler_prefix = get_option('prefix') / get_option('libdir')
+
+ add_test_setup(
+ 'default',
+ env: ['ANASTASIS_PREFIX=' + taler_prefix],
+ exclude_suites: ['perf', 'installcheck', 'integrationtests'],
+ is_default: true,
+ )
+else
+ subdir('contrib')
+ if not get_option('disable-doc')
+ subdir('doc')
+ endif
+endif
+
+run_target(
+ 'doxygen',
+ command: 'scripts/doxygen.meson.sh',
+ env: {'PACKAGE_VERSION': meson.project_version()},
+)
+
+#meson.add_dist_script('meson-dist-script')
+
diff --git a/meson.options b/meson.options
@@ -0,0 +1,5 @@
+# Build options
+option('only-doc', type : 'boolean', value : false, description: 'whether to compile documentation ONLY')
+option('disable-doc', type : 'boolean', value : false, description: 'whether to disable documentation')
+option('install-rpath', type : 'boolean', value : false, description: 'Add rpath to installed binaries if set')
+option('logging', type : 'string', value: 'yes', description: 'Log setting. Can be set to "yes" (logging, default), "no" (no logging), "verbose" (extra logging"), "veryverbose" (even more logging)')
diff --git a/scripts/doxygen.meson.sh b/scripts/doxygen.meson.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# This is more portable than `which' but comes with
+# the caveat of not(?) properly working on busybox's ash:
+existence()
+{
+ type "$1" >/dev/null 2>&1
+}
+
+if ! existence doxygen; then
+ echo "Doxygen not found"
+ exit 1
+fi
+cd "${MESON_SOURCE_ROOT}/doc/doxygen"
+echo "PROJECT_NUMBER = ${PACKAGE_VERSION}" > version.doxy
+make all
+
+echo "Doxygen files generated into ${MESON_SOURCE_ROOT}/doc/doxygen!"
diff --git a/src/anastasis/anastasis-gtk_action.h b/src/anastasis/anastasis-gtk_action.h
@@ -26,7 +26,6 @@
*/
#ifndef ANASTASIS_GTK_ACTION_H
#define ANASTASIS_GTK_ACTION_H
-#include <gnunet-gtk/gnunet_gtk.h>
#include <gtk/gtk.h>
#include <anastasis/anastasis_service.h>
#include <anastasis/anastasis_redux.h>
diff --git a/src/anastasis/anastasis-gtk_helper.h b/src/anastasis/anastasis-gtk_helper.h
@@ -26,7 +26,6 @@
*/
#ifndef ANASTASIS_GTK_HELPER_H
#define ANASTASIS_GTK_HELPER_H
-#include <gnunet-gtk/gnunet_gtk.h>
#include <gtk/gtk.h>
#include <anastasis/anastasis_service.h>
#include <anastasis/anastasis_redux.h>
diff --git a/src/anastasis/meson.build b/src/anastasis/meson.build
@@ -0,0 +1,98 @@
+# This file is in the public domain
+anastasis_gtk_SOURCES = [
+ 'anastasis-gtk.c',
+ 'anastasis-gtk_action.c',
+ 'anastasis-gtk_attributes.c',
+ 'anastasis-gtk_autocomplete.c',
+ 'anastasis-gtk_dispatch.c',
+ 'anastasis-gtk_io.c',
+ 'anastasis-gtk_handle-add-provider.c',
+ 'anastasis-gtk_handle-auth-delete-button-clicked.c',
+ 'anastasis-gtk_handle-auth-edit-provider-clicked.c',
+ 'anastasis-gtk_handle-backup-button-clicked.c',
+ 'anastasis-gtk_handle-challenge-code.c',
+ 'anastasis-gtk_handle-challenge-iban.c',
+ 'anastasis-gtk_handle-challenge-question.c',
+ 'anastasis-gtk_handle-challenge-totp.c',
+ 'anastasis-gtk_handle-clear-secret-clicked.c',
+ 'anastasis-gtk_handle-continent-selected.c',
+ 'anastasis-gtk_handle-country-activated.c',
+ 'anastasis-gtk_handle-country-unselected.c',
+ 'anastasis-gtk_handle-core-secret-changed.c',
+ 'anastasis-gtk_handle-core-secret-name-changed.c',
+ 'anastasis-gtk_handle-expiration-change.c',
+ 'anastasis-gtk_handle-identity-changed.c',
+ 'anastasis-gtk_handle-main-window-forward-clicked.c',
+ 'anastasis-gtk_handle-main-window-back-clicked.c',
+ 'anastasis-gtk_handle-method-email.c',
+ 'anastasis-gtk_handle-method-iban.c',
+ 'anastasis-gtk_handle-method-post.c',
+ 'anastasis-gtk_handle-method-question.c',
+ 'anastasis-gtk_handle-method-sms.c',
+ 'anastasis-gtk_handle-method-totp.c',
+ 'anastasis-gtk_handle-payqr-selection-changed.c',
+ 'anastasis-gtk_handle-policy-activate.c',
+ 'anastasis-gtk_handle-policy-button.c',
+ 'anastasis-gtk_handle-policy-meta.c',
+ 'anastasis-gtk_handle-policy-selection-changed.c',
+ 'anastasis-gtk_handle-recovery-button-clicked.c',
+ 'anastasis-gtk_handle-secret-buttons.c',
+ 'anastasis-gtk_helper.c',
+ 'anastasis-gtk_pe-add-policy.c',
+ 'anastasis-gtk_pe-delete-challenge.c',
+ 'anastasis-gtk_pe-delete-policy.c',
+ 'anastasis-gtk_pe-edit-policy.c',
+ 'anastasis-gtk_progress.c',
+]
+
+if haru_dep.found()
+ anastasis_gtk_SOURCES += 'anastasis-gtk_handle-print.c'
+ anastasis_gtk_SOURCES += 'print.c'
+else
+ anastasis_gtk_SOURCES += 'anastasis-gtk_handle-noprint.c'
+endif
+
+executable(
+ 'anastasis-gtk',
+ anastasis_gtk_SOURCES,
+ dependencies: [
+ libanastasisgtkutil_dep,
+ glade_dep,
+ gtk_dep,
+ gnunetutil_dep,
+ gnunetjson_dep,
+ gnunetcurl_dep,
+ qrencode_dep,
+ anastasisrest_dep,
+ anastasisredux_dep,
+ anastasisutil_dep,
+ talerjson_dep,
+ talerutil_dep,
+ json_dep,
+ gcrypt_dep,
+ mhd_dep,
+ magic_dep,
+ haru_dep,
+ ],
+ include_directories: [incdir, configuration_inc],
+ install: true,
+)
+
+
+#EXTRA_DIST = \
+# gettext.h
+#
+#if HPDF_ENABLED
+#noinst_PROGRAMS = \
+# test-print
+#
+#test_print_SOURCES = \
+# test-print.c \
+# print.c
+#test_print_LDADD = \
+# $(HPDF_LIBS) \
+# -lgnunetutil \
+# -ljansson
+#test_print_CFLAGS = \
+# $(HPDF_CFLAGS)
+#endif
diff --git a/src/include/meson.build b/src/include/meson.build
@@ -0,0 +1,3 @@
+# This file is in the public domain
+
+install_data('anastasis_gtk_util.h', install_dir: get_option('includedir') / 'anastasis-gtk')
diff --git a/src/meson.build b/src/meson.build
@@ -0,0 +1,5 @@
+# This file is in the public domain
+subdir('include')
+subdir('util')
+subdir('anastasis')
+#subdir('testing')
diff --git a/src/util/meson.build b/src/util/meson.build
@@ -0,0 +1,25 @@
+# This file is in the public domain
+libanastasisgtkutil = library(
+ 'anastasisgtkutil',
+ ['eventloop.c','glade.c','nls.c','os_installation.c'],
+ soversion: solibversions['libanastasisgtkutil']['soversion'],
+ version: solibversions['libanastasisgtkutil']['soversion'],
+ install_rpath: rpath_option,
+ dependencies: [
+ gnunetutil_dep,
+ gtk_dep,
+ glade_dep,
+ ],
+ include_directories: [incdir, configuration_inc],
+ install: true,
+ install_dir: get_option('libdir'),
+)
+
+libanastasisgtkutil_dep = declare_dependency(link_with: libanastasisgtkutil)
+pkg.generate(
+ libanastasisgtkutil,
+ url: 'https://taler.net',
+ description: 'GNU Anastasis utilities library',
+)
+
+