diff options
Diffstat (limited to 'contrib')
38 files changed, 548 insertions, 411 deletions
diff --git a/contrib/articles/spending.txt b/contrib/articles/spending.txt index 7f2c716f8..887a80910 100644 --- a/contrib/articles/spending.txt +++ b/contrib/articles/spending.txt @@ -45,7 +45,7 @@ If the above parameters have an optimal assignment, then replacing v'[x] := 0 gives another optimal solution, as otherwise we'd get a better one for the first situation. -There is however no assurence that t[x] = price mod v[x] for some x in D, so nievely such solutions give you running times like O(price * |D|), which kinda sucks actually. Just one simplified example : +There is however no assurence that t[x] = price mod v[x] for some x in D, so naively such solutions give you running times like O(price * |D|), which kinda sucks actually. Just one simplified example : http://www.codeproject.com/Articles/31002/Coin-Change-Problem-Using-Dynamic-Programming diff --git a/contrib/articles/ui/ui-cameraready.tex b/contrib/articles/ui/ui-cameraready.tex index ef79d91ba..b7015b8d3 100644 --- a/contrib/articles/ui/ui-cameraready.tex +++ b/contrib/articles/ui/ui-cameraready.tex @@ -881,7 +881,7 @@ the page. Then the wallet inspects the response as it may contain error reports about a failed payment which the wallet has to handle. By submitting the payment this way, we also ensure that this intermediate request does not require JavaScript and still does not -interfer with navigation. Once the Web shop confirms the payment, the +interfere with navigation. Once the Web shop confirms the payment, the wallet causes the fulfillment URL to be reloaded. If the contract hash does not match a payment which the user @@ -937,7 +937,7 @@ it has the following key advantages: other users has the expected behavior of asking the other user to pay for the resource. \item Asynchronously transmitting coins from injected JavaScript costs - one roundtrip, but does not interfer with navigation and allows + one roundtrip, but does not interfere with navigation and allows proper error handling. \item The different pages of the merchant have clear delineations: the shopping pages conclude by making an offer, and @@ -1137,7 +1137,7 @@ passes it to the wallet (sample code for this is shown in Figure~\ref{listing:http-contract}). Instead of adding any cryptographic logic to the merchant frontend, -the Taler merchant backend allows the implementor to delegate +the Taler merchant backend allows the implementer to delegate coin handling to the payment backend, which validates the coins, deposits them at the exchange, and finally validates and persists the receipt from the exchange. The merchant backend then communicates the diff --git a/contrib/articles/ui/ui.tex b/contrib/articles/ui/ui.tex index 37cd8b076..4aef43bd4 100644 --- a/contrib/articles/ui/ui.tex +++ b/contrib/articles/ui/ui.tex @@ -933,7 +933,7 @@ the page. Then the wallet inspects the response as it may contain error reports about a failed payment which the wallet has to handle. By submitting the payment this way, we also ensure that this intermediate request does not require JavaScript and still does not -interfer with navigation. Once the Web shop confirms the payment, the +interfere with navigation. Once the Web shop confirms the payment, the wallet causes the fulfillment URL to be reloaded. If the contract hash does not match a payment which the user @@ -989,7 +989,7 @@ it has the following key advantages: other users has the expected behavior of asking the other user to pay for the resource. \item Asynchronously transmitting coins from injected JavaScript costs - one roundtrip, but does not interfer with navigation and allows + one roundtrip, but does not interfere with navigation and allows proper error handling. \item The different pages of the merchant have clear delineations: the shopping pages conclude by making an offer, and @@ -1189,7 +1189,7 @@ passes it to the wallet (sample code for this is shown in Figure~\ref{listing:contract}). Instead of adding any cryptographic logic to the merchant frontend, -the Taler merchant backend allows the implementor to delegate +the Taler merchant backend allows the implementer to delegate coin handling to the payment backend, which validates the coins, deposits them at the exchange, and finally validates and persists the receipt from the exchange. The merchant backend then communicates the diff --git a/contrib/articles/ui/ui_short.tex b/contrib/articles/ui/ui_short.tex index 18f0c1de0..9257a997c 100644 --- a/contrib/articles/ui/ui_short.tex +++ b/contrib/articles/ui/ui_short.tex @@ -221,7 +221,7 @@ existing infrastructure. Instead of adding any cryptographic logic to the merchant front-end, -the generic Taler merchant backend allows the implementor to delegate +the generic Taler merchant backend allows the implementer to delegate handling of the coins to the payment backend, which validates the coins, deposits them at the exchange, and finally validates and persists the receipt from the exchange. The merchant backend then diff --git a/contrib/build-fast-web.sh b/contrib/build-fast-web.sh index ddc9f10f3..2f213e5f6 100755 --- a/contrib/build-fast-web.sh +++ b/contrib/build-fast-web.sh @@ -84,6 +84,12 @@ function build_preact_compat() { esbuild $BUNDLE_OPTIONS --loader:.js=jsx vendor/preact/test-utils/src/index.js > $DIST/react-dom/test-utils/index.js } +function build_qrcode() { + mkdir -p $DIST/qrcode-generator + + esbuild $BUNDLE_OPTIONS vendor/qrcode-generator/js/qrcode.js > $DIST/qrcode-generator/index.js +} + function build_history() { mkdir -p $DIST/{history,resolve-pathname,value-equal,tiny-warning,tiny-invariant} @@ -133,6 +139,7 @@ build_preact build_preact-router build_preact_compat +build_qrcode build_history build_linaria diff --git a/contrib/bump-taler-version.mjs b/contrib/bump-taler-version.mjs new file mode 100755 index 000000000..3a57bd01d --- /dev/null +++ b/contrib/bump-taler-version.mjs @@ -0,0 +1,119 @@ +#!/usr/bin/env node + +// Bump the package.json versions in Taler-related packagesin +// this repository. +// The version must be in one of the following formats: +// - x.y.z +// - x.y.z-dev.n + +import * as child_process from "child_process"; +import * as fs from "fs"; + +let requestedVersion = process.argv[2]; + +let dry = false; +if (process.argv.includes("--dry")) { + dry = true; +} + +let verMatched = false; +let verMajor = 0; +let verMinor = 0; +let verPatch = 0; +let verDev = undefined; + +// Parse the requested version +const releaseVerRegex = /^(\d+)[.](\d+)[.](\d+)$/; +const devVerRegex = /^(\d+)[.](\d+)[.](\d+)-dev[.](\d+)$/; + +const releaseMatch = requestedVersion.match(releaseVerRegex); +if (releaseMatch) { + verMatched = true; + verMajor = releaseMatch[1]; + verMinor = releaseMatch[2]; + verPatch = releaseMatch[3]; +} + +if (!verMatched) { + const devMatch = requestedVersion.match(devVerRegex); + if (devMatch) { + verMatched = true; + verMajor = devMatch[1]; + verMinor = devMatch[2]; + verPatch = devMatch[3]; + verDev = devMatch[4]; + } +} + +const packages = fs.readdirSync("packages") + +for (const pkg of packages) { + const p = `packages/${pkg}/package.json`; + const data = JSON.parse(fs.readFileSync(p)); + console.log(p, data.version); + if (!dry) { + data.version = requestedVersion; + fs.writeFileSync(p, JSON.stringify(data, undefined, 2) + "\n"); + } +} + +{ + const p = "packages/taler-wallet-webextension/manifest-common.json"; + const data = JSON.parse(fs.readFileSync(p)); + console.log("manifest version", data.version); + console.log("manifest version_name", data.version_name); + // In manifest.json, we transform x.y.z-dev.n info x.y.z.n. + // It's necessary because browsers only allow decimals and dots + // in that field. + let dottedVer = undefined; + if (verDev != null) { + dottedVer = `${verMajor}.${verMinor}.${verPatch}.${verDev}`; + } else { + dottedVer = `${verMajor}.${verMinor}.${verPatch}`; + } + console.log("new manifest version", dottedVer); + if (!dry) { + data.version = dottedVer; + data.version_name = requestedVersion; + fs.writeFileSync(p, JSON.stringify(data, undefined, 2) + "\n"); + } +} + +let debs = ["taler-wallet-cli", "taler-harness"]; + +for (const deb of debs) { + const p = `packages/${deb}/debian/changelog`; + const data = fs.readFileSync(p, { + encoding: "utf-8", + }); + const lines = data.split("\n"); + for (const line of lines) { + const s = line.trim(); + if (s == "") { + continue; + } + const re = /\((.*)\)/; + const m = s.match(re); + const version = m[1]; + let pfx = ""; + if (version != requestedVersion) { + pfx = "[!] "; + if (!dry) { + const dateStr = child_process.execSync("date -R", { + encoding: "utf-8", + }); + const entryLines = [ + `${deb} (${requestedVersion}) unstable; urgency=low`, + "", + ` * Release ${requestedVersion}`, + "", + ` -- Florian Dold <dold@taler.net> ${dateStr}`, + ``, + ]; + fs.writeFileSync(p, `${entryLines.join("\n")}${data}`); + } + } + console.log(`${pfx}${p} is ${version}`); + break; + } +} diff --git a/contrib/ci/Containerfile b/contrib/ci/Containerfile new file mode 100644 index 000000000..a9da11ae8 --- /dev/null +++ b/contrib/ci/Containerfile @@ -0,0 +1,27 @@ +FROM docker.io/library/node:18-slim + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update -yq && \ + apt-get install -yqq \ + git \ + python3 \ + codespell \ + python3-distutils \ + make \ + zip \ + jq \ + # Debian packaging tools \ + po-debconf \ + build-essential \ + debhelper-compat \ + devscripts \ + git-buildpackage \ + && rm -rf /var/lib/apt/lists/* + +RUN npm install -g pnpm + +# Set our workdir. All subsequent commands will be relative to this path. +WORKDIR /workdir + +CMD ["bash", "/workdir/ci/ci.sh"] diff --git a/contrib/ci/ci.sh b/contrib/ci/ci.sh new file mode 100755 index 000000000..0719015b9 --- /dev/null +++ b/contrib/ci/ci.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -exvuo pipefail + +# Requires podman +# Fails if not found in PATH +OCI_RUNTIME=$(which podman) +REPO_NAME=$(basename "${PWD}") +JOB_NAME="${1}" +JOB_ARCH=$((grep CONTAINER_ARCH contrib/ci/jobs/${JOB_NAME}/config.ini | cut -d' ' -f 3) || echo "${2:-amd64}") +JOB_CONTAINER=$((grep CONTAINER_NAME contrib/ci/jobs/${JOB_NAME}/config.ini | cut -d' ' -f 3) || echo "localhost/${REPO_NAME}:${JOB_ARCH}") +CONTAINER_BUILD=$((grep CONTAINER_BUILD contrib/ci/jobs/${JOB_NAME}/config.ini | cut -d' ' -f 3) || echo "True") + +echo "Image name: ${JOB_CONTAINER}" + +if [ "${CONTAINER_BUILD}" = "True" ] ; then + "${OCI_RUNTIME}" build \ + --arch "${JOB_ARCH}" \ + -t "${JOB_CONTAINER}" \ + -f contrib/ci/Containerfile . +fi + +"${OCI_RUNTIME}" run \ + --rm \ + -ti \ + --arch "${JOB_ARCH}" \ + --env CI_COMMIT_REF="$(git rev-parse HEAD)" \ + --volume "${PWD}":/workdir \ + --workdir /workdir \ + "${JOB_CONTAINER}" \ + contrib/ci/jobs/"${JOB_NAME}"/job.sh + +top_dir=$(dirname "${BASH_SOURCE[0]}") + +#"${top_dir}"/build.sh diff --git a/contrib/ci/jobs/0-codespell/config.ini b/contrib/ci/jobs/0-codespell/config.ini new file mode 100644 index 000000000..bd7d73860 --- /dev/null +++ b/contrib/ci/jobs/0-codespell/config.ini @@ -0,0 +1,6 @@ +[build] +HALT_ON_FAILURE = False +WARN_ON_FAILURE = True +CONTAINER_BUILD = False +CONTAINER_NAME = nixery.dev/shell/codespell +CONTAINER_ARCH = amd64 diff --git a/contrib/ci/jobs/0-codespell/dictionary.txt b/contrib/ci/jobs/0-codespell/dictionary.txt new file mode 100644 index 000000000..aeace0e9e --- /dev/null +++ b/contrib/ci/jobs/0-codespell/dictionary.txt @@ -0,0 +1,20 @@ +# List of "words" that codespell should ignore in our sources. +# +# Note: The word sensitivity depends on how the to-be-ignored word is +# spelled in codespell_lib/data/dictionary.txt. F.e. if there is a word +# 'foo' and you add 'Foo' _here_, codespell will continue to complain +# about 'Foo'. +# +aci +cant +ect +fo +som +te +ths +updateing +vie +zar +nam +pares +kwanza diff --git a/contrib/ci/jobs/0-codespell/job.sh b/contrib/ci/jobs/0-codespell/job.sh new file mode 100755 index 000000000..9271343e6 --- /dev/null +++ b/contrib/ci/jobs/0-codespell/job.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -exuo pipefail + +job_dir=$(dirname "${BASH_SOURCE[0]}") + +codespell -q 0 -I "${job_dir}"/dictionary.txt -S "*.bib,*.bst,*.cls,*.json,*.png,*.svg,*.wav,*.gz,*/templating/test?/**,**/auditor/*.sql,**/templating/mustach**,*.fees,*key,*.tag,*.info,*.latexmkrc,*.ecc,*.jpg,*.zkey,*.sqlite,*/contrib/hellos/**,*/vpn/tests/**,*.priv,*.file,*.tgz,*.woff,*.gif,*.odt,*.fee,*.deflate,*.dat,*.jpeg,*.eps,*.odg,*/m4/ax_lib_postgresql.m4,*/m4/libgcrypt.m4,*.rpath,config.status,ABOUT-NLS,*/doc/texinfo.tex,*.PNG,*.??.json,*.docx,*.ods,*.doc,*.docx,*.xcf,*.xlsx,*.ecc,*.ttf,*.woff2,*.eot,*.ttf,*.eot,*.mp4,*.pptx,*.epgz,*.min.js,**/*.map,**/fonts/**,*.pack.js,*.po,*.bbl,*/afl-tests/*,*/.git/**,*.pdf,*.epub,**/signing-key.asc,**/pnpm-lock.yaml,**/*.svg,**/*.cls,**/rfc.bib,**/*.bst,*/cbdc-es.tex,*/cbdc-it.tex,**/ExchangeSelection/example.ts,*/testcurl/test_tricky.c,*/i18n/strings.ts,*/src/anastasis-data.ts,**/doc/flows/main.de.tex,*/vendor/**,*/node_modules/**,*.pnpm-store/**" diff --git a/contrib/ci/jobs/1-build/build.sh b/contrib/ci/jobs/1-build/build.sh new file mode 100755 index 000000000..25a38946d --- /dev/null +++ b/contrib/ci/jobs/1-build/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -exuo pipefail + +./bootstrap +./configure --prefix=$HOME/local/ +make diff --git a/contrib/ci/jobs/1-build/job.sh b/contrib/ci/jobs/1-build/job.sh new file mode 100755 index 000000000..8d79902c5 --- /dev/null +++ b/contrib/ci/jobs/1-build/job.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -exuo pipefail + +job_dir=$(dirname "${BASH_SOURCE[0]}") + +"${job_dir}"/build.sh diff --git a/contrib/ci/jobs/2-docs/docs.sh b/contrib/ci/jobs/2-docs/docs.sh new file mode 100755 index 000000000..ee6abc2ac --- /dev/null +++ b/contrib/ci/jobs/2-docs/docs.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -exuo pipefail + +./bootstrap +./configure +make + +pnpm run typedoc diff --git a/contrib/ci/jobs/2-docs/job.sh b/contrib/ci/jobs/2-docs/job.sh new file mode 100755 index 000000000..a72bca4ba --- /dev/null +++ b/contrib/ci/jobs/2-docs/job.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -exuo pipefail + +job_dir=$(dirname "${BASH_SOURCE[0]}") + +"${job_dir}"/docs.sh diff --git a/contrib/ci/jobs/3-wallet-cli-deb-package/config.ini b/contrib/ci/jobs/3-wallet-cli-deb-package/config.ini new file mode 100644 index 000000000..fe4fd36a6 --- /dev/null +++ b/contrib/ci/jobs/3-wallet-cli-deb-package/config.ini @@ -0,0 +1,6 @@ +[build] +HALT_ON_FAILURE = False +WARN_ON_FAILURE = True +CONTAINER_BUILD = True +CONTAINER_NAME = localhost/wallet-core +CONTAINER_ARCH = amd64 diff --git a/contrib/ci/jobs/3-wallet-cli-deb-package/job.sh b/contrib/ci/jobs/3-wallet-cli-deb-package/job.sh new file mode 100755 index 000000000..ac9132929 --- /dev/null +++ b/contrib/ci/jobs/3-wallet-cli-deb-package/job.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -exuo pipefail +# This file is in the public domain. +# Helper script to build the latest DEB packages in the container. + + +unset LD_LIBRARY_PATH + +# Run the bootstrap script in case it hasn't been done already at this point +./bootstrap + +# gbp wants the debian directory in the root of the git repo +# so we symlink in the debian directory for the package we want to create +rm -f ./debian # in case we already have a symlink there +ln -s packages/taler-wallet-cli/debian . + +# Change to our package directory +cd packages/taler-wallet-cli + +# Install build-time dependencies. +# Update apt cache first +apt-get update +apt-get upgrade -y +mk-build-deps --install --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control + +export VERSION="$(../../contrib/ci/jobs/3-wallet-cli-deb-package/version.sh)" +echo "Building package version ${VERSION}" + +EMAIL=none gbp dch --ignore-branch --debian-tag="%(version)s" --git-author --new-version="${VERSION}" +echo "Current PWD is $PWD" +./configure --prefix=$HOME/local/ +dpkg-buildpackage -rfakeroot -b -uc -us + +ls -alh ../*.deb +mkdir -p /artifacts/wallet-core/${CI_COMMIT_REF} # Variable comes from CI environment +mv ../*.deb /artifacts/wallet-core/${CI_COMMIT_REF}/ diff --git a/contrib/ci/jobs/3-wallet-cli-deb-package/version.sh b/contrib/ci/jobs/3-wallet-cli-deb-package/version.sh new file mode 100755 index 000000000..52031b23a --- /dev/null +++ b/contrib/ci/jobs/3-wallet-cli-deb-package/version.sh @@ -0,0 +1,17 @@ +#!/bin/sh +set -ex + +BRANCH=$(git name-rev --name-only HEAD) +if [ -z "${BRANCH}" ]; then + exit 1 +else + # "Unshallow" our checkout, but only our current branch, and exclude the submodules. + git fetch --no-recurse-submodules --tags --depth=1000 origin "${BRANCH}" + RECENT_VERSION_TAG=$(git describe --tags --match 'v*.*.*' --exclude '*-dev*' --always --abbrev=0 HEAD || exit 1) + commits="$(git rev-list ${RECENT_VERSION_TAG}..HEAD --count)" + if [ "${commits}" = "0" ]; then + git describe --tag HEAD | sed -r 's/^v//' || exit 1 + else + echo $(echo ${RECENT_VERSION_TAG} | sed -r 's/^v//')-${commits}-$(git rev-parse --short=8 HEAD) + fi +fi diff --git a/contrib/ci/jobs/4-taler-harness-deb-package/config.ini b/contrib/ci/jobs/4-taler-harness-deb-package/config.ini new file mode 100644 index 000000000..fe4fd36a6 --- /dev/null +++ b/contrib/ci/jobs/4-taler-harness-deb-package/config.ini @@ -0,0 +1,6 @@ +[build] +HALT_ON_FAILURE = False +WARN_ON_FAILURE = True +CONTAINER_BUILD = True +CONTAINER_NAME = localhost/wallet-core +CONTAINER_ARCH = amd64 diff --git a/contrib/ci/jobs/4-taler-harness-deb-package/job.sh b/contrib/ci/jobs/4-taler-harness-deb-package/job.sh new file mode 100755 index 000000000..c58c643e6 --- /dev/null +++ b/contrib/ci/jobs/4-taler-harness-deb-package/job.sh @@ -0,0 +1,36 @@ +#!/bin/bash +set -exuo pipefail +# This file is in the public domain. +# Helper script to build the latest DEB packages in the container. + + +unset LD_LIBRARY_PATH + +# Run the bootstrap script in case it hasn't been done already at this point +./bootstrap + +# gbp wants the debian directory in the root of the git repo +# so we symlink in the debian directory for the package we want to create +rm -f ./debian # in case we already have a symlink there +ln -s packages/taler-harness/debian . + +# Change to our package directory +cd packages/taler-harness + +# Install build-time dependencies. +# Update apt cache first +apt-get update +apt-get upgrade -y +mk-build-deps --install --tool='apt-get -o Debug::pkgProblemResolver=yes --no-install-recommends --yes' debian/control + +export VERSION="$(../../contrib/ci/jobs/4-taler-harness-deb-package/version.sh)" +echo "Building package version ${VERSION}" + +EMAIL=none gbp dch --ignore-branch --debian-tag="%(version)s" --git-author --new-version="${VERSION}" +echo "Current PWD is $PWD" +./configure --prefix=$HOME/local/ +dpkg-buildpackage -rfakeroot -b -uc -us + +ls -alh ../*.deb +mkdir -p /artifacts/wallet-core/${CI_COMMIT_REF} # Variable comes from CI environment +mv ../*.deb /artifacts/wallet-core/${CI_COMMIT_REF}/ diff --git a/contrib/ci/jobs/4-taler-harness-deb-package/version.sh b/contrib/ci/jobs/4-taler-harness-deb-package/version.sh new file mode 100755 index 000000000..52031b23a --- /dev/null +++ b/contrib/ci/jobs/4-taler-harness-deb-package/version.sh @@ -0,0 +1,17 @@ +#!/bin/sh +set -ex + +BRANCH=$(git name-rev --name-only HEAD) +if [ -z "${BRANCH}" ]; then + exit 1 +else + # "Unshallow" our checkout, but only our current branch, and exclude the submodules. + git fetch --no-recurse-submodules --tags --depth=1000 origin "${BRANCH}" + RECENT_VERSION_TAG=$(git describe --tags --match 'v*.*.*' --exclude '*-dev*' --always --abbrev=0 HEAD || exit 1) + commits="$(git rev-list ${RECENT_VERSION_TAG}..HEAD --count)" + if [ "${commits}" = "0" ]; then + git describe --tag HEAD | sed -r 's/^v//' || exit 1 + else + echo $(echo ${RECENT_VERSION_TAG} | sed -r 's/^v//')-${commits}-$(git rev-parse --short=8 HEAD) + fi +fi diff --git a/contrib/ci/jobs/5-deploy-packages/config.ini b/contrib/ci/jobs/5-deploy-packages/config.ini new file mode 100644 index 000000000..08c106f9c --- /dev/null +++ b/contrib/ci/jobs/5-deploy-packages/config.ini @@ -0,0 +1,6 @@ +[build] +HALT_ON_FAILURE = True +WARN_ON_FAILURE = True +CONTAINER_BUILD = False +CONTAINER_NAME = nixery.dev/shell/rsync +CONTAINER_ARCH = amd64 diff --git a/contrib/ci/jobs/5-deploy-packages/job.sh b/contrib/ci/jobs/5-deploy-packages/job.sh new file mode 100755 index 000000000..46ed90f70 --- /dev/null +++ b/contrib/ci/jobs/5-deploy-packages/job.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -exuo pipefail + +ARTIFACT_PATH="/artifacts/wallet-core/${CI_COMMIT_REF}/*.deb" + +RSYNC_HOST="taler.host.internal" +RSYNC_PORT=424242 +RSYNC_PATH="incoming_packages/bookworm-taler-ci/" +RSYNC_DEST="rsync://${RSYNC_HOST}/${RSYNC_PATH}" + + +rsync -vP \ + --port ${RSYNC_PORT} \ + ${ARTIFACT_PATH} ${RSYNC_DEST} diff --git a/contrib/cleanup-prebuilt-dir.sh b/contrib/cleanup-prebuilt-dir.sh new file mode 100755 index 000000000..5553fb467 --- /dev/null +++ b/contrib/cleanup-prebuilt-dir.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +# make sure that the prebuilt directory is clean +# before building +# this script is part of the make prebuilt +cd prebuilt +git checkout -- . +git pull diff --git a/contrib/copy-aml-backoffice-into-prebuilt.sh b/contrib/copy-aml-backoffice-into-prebuilt.sh new file mode 100755 index 000000000..2b94327e6 --- /dev/null +++ b/contrib/copy-aml-backoffice-into-prebuilt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +find packages/aml-backoffice-ui/dist/prod/ -type f -printf '%P\n' | sort > prebuilt/aml-backoffice/bof + +while IFS= read -r file; do + cp packages/aml-backoffice-ui/dist/prod/$file prebuilt/aml-backoffice/$file +done < prebuilt/aml-backoffice/bof + diff --git a/contrib/copy-anastasis-into-prebuilt.sh b/contrib/copy-anastasis-into-prebuilt.sh new file mode 100755 index 000000000..36335bfcf --- /dev/null +++ b/contrib/copy-anastasis-into-prebuilt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +find packages/anastasis-webui/dist/prod/ -type f -printf '%P\n' | sort > prebuilt/anastasis/bof + +while IFS= read -r file; do + cp packages/anastasis-webui/dist/prod/$file prebuilt/anastasis/$file +done < prebuilt/anastasis/bof + diff --git a/contrib/copy-auditor-backoffice-into-prebuilt.sh b/contrib/copy-auditor-backoffice-into-prebuilt.sh new file mode 100755 index 000000000..6b6544183 --- /dev/null +++ b/contrib/copy-auditor-backoffice-into-prebuilt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +find packages/auditor-backoffice-ui/dist/prod/ -type f -printf '%P\n' | sort > prebuilt/auditor-backoffice/bof + +while IFS= read -r file; do + cp packages/auditor-backoffice-ui/dist/prod/$file prebuilt/auditor-backoffice/$file +done < prebuilt/auditor-backoffice/bof + diff --git a/contrib/copy-backend-into-prebuilt.sh b/contrib/copy-backend-into-prebuilt.sh new file mode 100755 index 000000000..81d38cdea --- /dev/null +++ b/contrib/copy-backend-into-prebuilt.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +for file in offer_refund.en.html request_payment.en.html show_order_details.en.html; do + cp packages/merchant-backend-ui/dist/pages/$file prebuilt/backend/ +done + diff --git a/contrib/copy-backoffice-into-prebuilt.sh b/contrib/copy-backoffice-into-prebuilt.sh new file mode 100755 index 000000000..d21b91096 --- /dev/null +++ b/contrib/copy-backoffice-into-prebuilt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +find packages/merchant-backoffice-ui/dist/prod/ -type f -printf '%P\n' | sort > prebuilt/backoffice/bof + +while IFS= read -r file; do + cp packages/merchant-backoffice-ui/dist/prod/$file prebuilt/backoffice/$file +done < prebuilt/backoffice/bof + diff --git a/contrib/copy-bank-into-prebuilt.sh b/contrib/copy-bank-into-prebuilt.sh new file mode 100755 index 000000000..5ad375767 --- /dev/null +++ b/contrib/copy-bank-into-prebuilt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +find packages/bank-ui/dist/prod/ -type f -printf '%P\n' | sort > prebuilt/bank/bof + +while IFS= read -r file; do + cp packages/bank-ui/dist/prod/$file prebuilt/bank/$file +done < prebuilt/bank/bof + diff --git a/contrib/copy-challenger-into-prebuilt.sh b/contrib/copy-challenger-into-prebuilt.sh new file mode 100755 index 000000000..ebc39192c --- /dev/null +++ b/contrib/copy-challenger-into-prebuilt.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +[ ! -d prebuilt ] && git worktree add -f prebuilt prebuilt && exit 1 + +find packages/challenger-ui/dist/prod/ -type f -printf '%P\n' | sort > prebuilt/challenger/bof + +while IFS= read -r file; do + cp packages/challenger-ui/dist/prod/$file prebuilt/challenger/$file +done < prebuilt/challenger/bof + diff --git a/contrib/custom-protocol/README b/contrib/custom-protocol/README new file mode 100644 index 000000000..0ebbeed4d --- /dev/null +++ b/contrib/custom-protocol/README @@ -0,0 +1,33 @@ +Custom protocol handler for taler:// URI + +In order to run the wallet when trying to open an html anchor to a ref starting with "taler://" you have to setup a custom protocol handler in your local setup. + + + +First add this content into file `.config/mimeapps.list` under section `[Default Applications]` + +``` +x-scheme-handler/taler=taler-wallet-cli.desktop +x-scheme-handler/taler+http=taler-wallet-cli.desktop +``` + +then create a file named `taler-wallet-cli.desktop` in location `$HOME/.local/share/applications` with content + +``` +[Desktop Entry] +Name=GNU Taler Wallet CLI URL Handler +GenericName=Wallet +Comment=Handle URL Scheme taler:// +Exec=bash -c "taler-wallet-cli handle-uri %u; read" +Terminal=true +Type=Application +MimeType=x-scheme-handler/taler;x-scheme-handler/taler+http +Name[en_US]=GNU Taler Wallet URL Handler +``` + +Done, you can test it using the next command: + +``` +$ xdg-open taler://withdraw/bank.demo.taler.net/api/793ee3e4-2915-47e8-9abe-bcc36c8e65cf +``` + diff --git a/contrib/custom-protocol/taler-wallet-cli.desktop b/contrib/custom-protocol/taler-wallet-cli.desktop new file mode 100755 index 000000000..35c8e5154 --- /dev/null +++ b/contrib/custom-protocol/taler-wallet-cli.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=GNU Taler Wallet CLI URL Handler +GenericName=Wallet +Comment=Handle URL Scheme taler:// +Exec=bash -c "taler-wallet-cli handle-uri %u; read" +Terminal=true +Type=Application +MimeType=x-scheme-handler/taler;x-scheme-handler/taler+http +Icon=sublime-text-2 +Categories=TextEditor;Development;Utility; +Name[en_US]=GNU Taler Wallet URL Handler + diff --git a/contrib/devrelease.sh b/contrib/devrelease.sh index 72b059a01..4418ee539 100755 --- a/contrib/devrelease.sh +++ b/contrib/devrelease.sh @@ -16,7 +16,7 @@ fi mkdir -p prebuilt/$devtag -cp packages/taler-wallet-android/dist/taler-wallet-android.js prebuilt/$devtag/ +cp packages/taler-wallet-embedded/dist/taler-wallet-embedded.js prebuilt/$devtag/ cd prebuilt git add -A $devtag git commit -m "prebuilt files for $devtag" || true diff --git a/contrib/publish-prebuilt-dir.sh b/contrib/publish-prebuilt-dir.sh new file mode 100755 index 000000000..a636c6de6 --- /dev/null +++ b/contrib/publish-prebuilt-dir.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# this script is part of the make prebuilt procedure +# is expected on the root folder + +# create a commit message with the commit id +COMMIT=$(git rev-parse --verify HEAD) +MSG="built from ${COMMIT}" + +# after building process has copy everything into +# the prebuilt folder +cd prebuilt +git commit -m "$MSG" -a +git show --stat +echo "ready to push" diff --git a/contrib/publish-prebuilt.sh b/contrib/publish-prebuilt.sh new file mode 100755 index 000000000..94bd274ff --- /dev/null +++ b/contrib/publish-prebuilt.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +# Helper script to publish a prebuilt wallet-core. +# Assumes that the prebuilt branch is checked out +# at ./prebuilt as a git worktree. + +set -eu + +TAG=$1 + +pnpm run compile +mkdir prebuilt/$TAG +cp packages/taler-wallet-embedded/dist/taler-wallet-embedded.js prebuilt/$TAG/taler-wallet-embedded.js +git -C prebuilt add . +git -C prebuilt commit -a -m "prebuilt $TAG" +git -C prebuilt push +sha256sum prebuilt/$TAG/taler-wallet-android.js diff --git a/contrib/sample-data/history1.json b/contrib/sample-data/history1.json deleted file mode 100644 index 8d0076a31..000000000 --- a/contrib/sample-data/history1.json +++ /dev/null @@ -1,402 +0,0 @@ -{ - "history": [ - { - "type": "exchange-added", - "builtIn": false, - "eventId": "exchange-added;https%3A%2F%2Fexchange.demo.taler.net%2F", - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "timestamp": { - "t_ms": 1578334008633 - } - }, - { - "type": "exchange-updated", - "eventId": "exchange-updated;https%3A%2F%2Fexchange.demo.taler.net%2F", - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "timestamp": { - "t_ms": 1578334009266 - } - }, - { - "type": "reserve-balance-updated", - "eventId": "reserve-balance-updated;HHG1KBFSW4PM8J43D14GVJYB8F5J56RDHANY1EQSW6RTYDAQJC6G", - "amountExpected": "KUDOS:5", - "amountReserveBalance": "KUDOS:5", - "timestamp": { - "t_ms": 1578334039291 - }, - "newHistoryTransactions": [ - { - "amount": "KUDOS:5", - "sender_account_url": "payto://x-taler-bank/bank.demo.taler.net/65", - "timestamp": { - "t_ms": 1578334028000 - }, - "wire_reference": "000000000038Y", - "type": "DEPOSIT" - } - ], - "reserveShortInfo": { - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "reserveCreationDetail": { - "type": "taler-bank-withdraw", - "bankUrl": "https://bank.demo.taler.net/api/withdraw-operation/6fd6a78f-3d12-4c91-b5e4-c6fc31f44e8d" - }, - "reservePub": "JPE7VR8R985WQ7ZX3EEYRTEGJQ1FAFE7P3JK1J7WFJEP7AGNTJD0" - } - }, - { - "type": "withdrawn", - "withdrawSessionId": "SFW3JS0JV0GZQQ1W07TNQEAGBD84X2QMH38PJ2CCTTKSDKQFCBY0", - "eventId": "withdrawn;SFW3JS0JV0GZQQ1W07TNQEAGBD84X2QMH38PJ2CCTTKSDKQFCBY0", - "amountWithdrawnEffective": "KUDOS:4.8", - "amountWithdrawnRaw": "KUDOS:5", - "exchangeBaseUrl": "https://exchange.demo.taler.net/", - "timestamp": { - "t_ms": 1578334039853 - }, - "withdrawalSource": { - "type": "reserve", - "reservePub": "JPE7VR8R985WQ7ZX3EEYRTEGJQ1FAFE7P3JK1J7WFJEP7AGNTJD0" - } - }, - { - "type": "order-accepted", - "eventId": "order-accepted;RNFEQ2FHF6NPM5M58HJH635TD4CE9S2SRNK3VN9SCMH3H7H0REBG", - "orderShortInfo": { - "amount": "KUDOS:0.5", - "orderId": "2020.006-G1NT65XRPQ8GP", - "merchantBaseUrl": "https://backend.demo.taler.net/public/instances/FSF/", - "proposalId": "RNFEQ2FHF6NPM5M58HJH635TD4CE9S2SRNK3VN9SCMH3H7H0REBG", - "summary": "Essay: 2. The GNU Project" - }, - "timestamp": { - "t_ms": 1578334078823 - } - }, - { - "type": "order-redirected", - "eventId": "order-redirected;0W4EBHQJ90XX4TSQ9C0M6K9MBFJ1ENKTWH4R3CXFT986A2QHCESG", - "alreadyPaidOrderShortInfo": { - "amount": "KUDOS:0.5", - "orderId": "2020.006-G1NT65XRPQ8GP", - "merchantBaseUrl": "https://backend.demo.taler.net/public/instances/FSF/", - "proposalId": "RNFEQ2FHF6NPM5M58HJH635TD4CE9S2SRNK3VN9SCMH3H7H0REBG", - "summary": "Essay: 2. The GNU Project" - }, - "newOrderShortInfo": { - "amount": "KUDOS:0.5", - "orderId": "2020.006-00W4ANVVKAHAP", - "merchantBaseUrl": "https://backend.demo.taler.net/public/instances/FSF/", - "proposalId": "0W4EBHQJ90XX4TSQ9C0M6K9MBFJ1ENKTWH4R3CXFT986A2QHCESG", - "summary": "Essay: 2. The GNU Project" - }, - "timestamp": { - "t_ms": 1578334108380 - } - }, - { - "type": "payment-sent", - "eventId": "payment-sent;RNFEQ2FHF6NPM5M58HJH635TD4CE9S2SRNK3VN9SCMH3H7H0REBG", - "orderShortInfo": { - "amount": "KUDOS:0.5", - "orderId": "2020.006-G1NT65XRPQ8GP", - "merchantBaseUrl": "https://backend.demo.taler.net/public/instances/FSF/", - "proposalId": "RNFEQ2FHF6NPM5M58HJH635TD4CE9S2SRNK3VN9SCMH3H7H0REBG", - "summary": "Essay: 2. The GNU Project" - }, - "replay": true, - "sessionId": "ab48396f-3aa1-4e1f-bfb5-30852d1e0d5e", - "timestamp": { - "t_ms": 1578334108677 - }, - "numCoins": 6, - "amountPaidWithFees": "KUDOS:0.54" - }, - { - "type": "exchange-added", - "builtIn": false, - "eventId": "exchange-added;https%3A%2F%2Fexchange.test.taler.net%2F", - "exchangeBaseUrl": "https://exchange.test.taler.net/", - "timestamp": { - "t_ms": 1578334134741 - } - }, - { - "type": "exchange-updated", - "eventId": "exchange-updated;https%3A%2F%2Fexchange.test.taler.net%2F", - "exchangeBaseUrl": "https://exchange.test.taler.net/", - "timestamp": { - "t_ms": 1578334135451 - } - }, - { - "type": "reserve-balance-updated", - "eventId": "reserve-balance-updated;498DDH4ZB41QX45FH38T4Y8JM14WX8Q2J1VKKZTE0CMS6TCPYZAG", - "amountExpected": "TESTKUDOS:5", - "amountReserveBalance": "TESTKUDOS:5", - "timestamp": { - "t_ms": 1578334141843 - }, - "newHistoryTransactions": [ - { - "amount": "TESTKUDOS:5", - "sender_account_url": "payto://x-taler-bank/bank.test.taler.net/9", - "timestamp": { - "t_ms": 1578334138000 - }, - "wire_reference": "0000000000184", - "type": "DEPOSIT" - } - ], - "reserveShortInfo": { - "exchangeBaseUrl": "https://exchange.test.taler.net/", - "reserveCreationDetail": { - "type": "taler-bank-withdraw", - "bankUrl": "https://bank.test.taler.net/api/withdraw-operation/e6210f62-d27b-4f58-815c-c5160de8804c" - }, - "reservePub": "ZQ2N7V8M035HAD1HTW7ZX22NM9GAXDCGX6GSJECD2KEY9TN3C0V0" - } - }, - { - "type": "withdrawn", - "withdrawSessionId": "AAVX0GVZ8GRPYX2RWANQ9J279ABA7KNFYEQ3A0C63TW7NMV0GAT0", - "eventId": "withdrawn;AAVX0GVZ8GRPYX2RWANQ9J279ABA7KNFYEQ3A0C63TW7NMV0GAT0", - "amountWithdrawnEffective": "TESTKUDOS:5", - "amountWithdrawnRaw": "TESTKUDOS:5", - "exchangeBaseUrl": "https://exchange.test.taler.net/", - "timestamp": { - "t_ms": 1578334142432 - }, - "withdrawalSource": { - "type": "reserve", - "reservePub": "ZQ2N7V8M035HAD1HTW7ZX22NM9GAXDCGX6GSJECD2KEY9TN3C0V0" - } - }, - { - "type": "refreshed", - "refreshGroupId": "2TARBASBNCE0X7F0D89Z3TJGPXKRARFSBH3HKZ5JFQRKPV9CA5C0", - "eventId": "refreshed;2TARBASBNCE0X7F0D89Z3TJGPXKRARFSBH3HKZ5JFQRKPV9CA5C0", - "timestamp": { - "t_ms": 1578334142528 - }, - "refreshReason": "pay", - "amountRefreshedEffective": "KUDOS:0", - "amountRefreshedRaw": "KUDOS:0.06", - "numInputCoins": 6, - "numOutputCoins": 0, - "numRefreshedInputCoins": 0 - }, - { - "type": "order-accepted", - "eventId": "order-accepted;W39MQT31M1ZY3NPF9ZSGXM8Q1K5XS5D5R1J10ZSHBREC6EZ570F0", - "orderShortInfo": { - "amount": "TESTKUDOS:1", - "orderId": "2020.006-00GBW7AD1VFRW", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/GNUnet/", - "proposalId": "W39MQT31M1ZY3NPF9ZSGXM8Q1K5XS5D5R1J10ZSHBREC6EZ570F0", - "summary": "Donation to GNUnet" - }, - "timestamp": { - "t_ms": 1578334230099 - } - }, - { - "type": "payment-sent", - "eventId": "payment-sent;W39MQT31M1ZY3NPF9ZSGXM8Q1K5XS5D5R1J10ZSHBREC6EZ570F0", - "orderShortInfo": { - "amount": "TESTKUDOS:1", - "orderId": "2020.006-00GBW7AD1VFRW", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/GNUnet/", - "proposalId": "W39MQT31M1ZY3NPF9ZSGXM8Q1K5XS5D5R1J10ZSHBREC6EZ570F0", - "summary": "Donation to GNUnet" - }, - "replay": false, - "timestamp": { - "t_ms": 1578334232527 - }, - "numCoins": 4, - "amountPaidWithFees": "TESTKUDOS:1" - }, - { - "type": "order-accepted", - "eventId": "order-accepted;Y8230SR6DP52J61CHEAPM5NHRVK408YP5KJP6VRBGZ3QZ0TBZQ90", - "orderShortInfo": { - "amount": "TESTKUDOS:0.1", - "orderId": "2020.006-02RFGFSSAZY9Y", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/Taler/", - "proposalId": "Y8230SR6DP52J61CHEAPM5NHRVK408YP5KJP6VRBGZ3QZ0TBZQ90", - "summary": "Donation to Taler" - }, - "timestamp": { - "t_ms": 1578334258703 - } - }, - { - "type": "payment-sent", - "eventId": "payment-sent;Y8230SR6DP52J61CHEAPM5NHRVK408YP5KJP6VRBGZ3QZ0TBZQ90", - "orderShortInfo": { - "amount": "TESTKUDOS:0.1", - "orderId": "2020.006-02RFGFSSAZY9Y", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/Taler/", - "proposalId": "Y8230SR6DP52J61CHEAPM5NHRVK408YP5KJP6VRBGZ3QZ0TBZQ90", - "summary": "Donation to Taler" - }, - "replay": false, - "timestamp": { - "t_ms": 1578334260497 - }, - "numCoins": 1, - "amountPaidWithFees": "TESTKUDOS:0.1" - }, - { - "type": "reserve-balance-updated", - "eventId": "reserve-balance-updated;NBZX24YB4GEHFXFXD5NJAC84ZZD63DFAD6Q7YFJQGX8WX9YQ7B90", - "amountExpected": "TESTKUDOS:15", - "amountReserveBalance": "TESTKUDOS:15", - "timestamp": { - "t_ms": 1578334530519 - }, - "newHistoryTransactions": [ - { - "amount": "TESTKUDOS:15", - "sender_account_url": "payto://x-taler-bank/bank.test.taler.net/9", - "timestamp": { - "t_ms": 1578334522000 - }, - "wire_reference": "000000000018C", - "type": "DEPOSIT" - } - ], - "reserveShortInfo": { - "exchangeBaseUrl": "https://exchange.test.taler.net/", - "reserveCreationDetail": { - "type": "taler-bank-withdraw", - "bankUrl": "https://bank.test.taler.net/api/withdraw-operation/6b5fae55-3634-4e6b-a877-2f8bd76dfaf9" - }, - "reservePub": "5XZC4DQMNR3482443727Q2RNKRVEBEW7SFJ8N9TYV5AZ74AZJB4G" - } - }, - { - "type": "withdrawn", - "withdrawSessionId": "312AKNY5BGF08PY1ZK0Z2QBEZ3481NFP9BN36Z08FHJQQZW80EZG", - "eventId": "withdrawn;312AKNY5BGF08PY1ZK0Z2QBEZ3481NFP9BN36Z08FHJQQZW80EZG", - "amountWithdrawnEffective": "TESTKUDOS:15", - "amountWithdrawnRaw": "TESTKUDOS:15", - "exchangeBaseUrl": "https://exchange.test.taler.net/", - "timestamp": { - "t_ms": 1578334531085 - }, - "withdrawalSource": { - "type": "reserve", - "reservePub": "5XZC4DQMNR3482443727Q2RNKRVEBEW7SFJ8N9TYV5AZ74AZJB4G" - } - }, - { - "type": "refreshed", - "refreshGroupId": "3FN9PFD2JCPS3FDHZDPRS50VQT4G7SE54JDTG2ZW2HV1R3PJ9KBG", - "eventId": "refreshed;3FN9PFD2JCPS3FDHZDPRS50VQT4G7SE54JDTG2ZW2HV1R3PJ9KBG", - "timestamp": { - "t_ms": 1578334532478 - }, - "refreshReason": "pay", - "amountRefreshedEffective": "TESTKUDOS:2.46", - "amountRefreshedRaw": "TESTKUDOS:2.46", - "numInputCoins": 1, - "numOutputCoins": 6, - "numRefreshedInputCoins": 1 - }, - { - "type": "refreshed", - "refreshGroupId": "DF0DQ6MGJ39R0891B0P86MY2QTMPF9FPDJN30PRBMXBZ8XEVHZE0", - "eventId": "refreshed;DF0DQ6MGJ39R0891B0P86MY2QTMPF9FPDJN30PRBMXBZ8XEVHZE0", - "timestamp": { - "t_ms": 1578334533177 - }, - "refreshReason": "pay", - "amountRefreshedEffective": "TESTKUDOS:1.12", - "amountRefreshedRaw": "TESTKUDOS:1.12", - "numInputCoins": 4, - "numOutputCoins": 3, - "numRefreshedInputCoins": 1 - }, - { - "type": "order-accepted", - "eventId": "order-accepted;KYSVHAENJFQB308KF6ENPM46VJRFAXFRDGW856P7MM90AW60REZ0", - "orderShortInfo": { - "amount": "TESTKUDOS:0.5", - "orderId": "2020.006-03WSPCDEZK6HG", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/FSF/", - "proposalId": "KYSVHAENJFQB308KF6ENPM46VJRFAXFRDGW856P7MM90AW60REZ0", - "summary": "Essay: 6. Why Software Should Be Free" - }, - "timestamp": { - "t_ms": 1578334554161 - } - }, - { - "type": "payment-sent", - "eventId": "payment-sent;KYSVHAENJFQB308KF6ENPM46VJRFAXFRDGW856P7MM90AW60REZ0", - "orderShortInfo": { - "amount": "TESTKUDOS:0.5", - "orderId": "2020.006-03WSPCDEZK6HG", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/FSF/", - "proposalId": "KYSVHAENJFQB308KF6ENPM46VJRFAXFRDGW856P7MM90AW60REZ0", - "summary": "Essay: 6. Why Software Should Be Free" - }, - "replay": false, - "sessionId": "489c048b-7702-49e8-b66f-2de5e33f0008", - "timestamp": { - "t_ms": 1578334556292 - }, - "numCoins": 5, - "amountPaidWithFees": "TESTKUDOS:0.5" - }, - { - "type": "refreshed", - "refreshGroupId": "NG8Z05Q8CM7KCC98PDNDQR0G920J2SGYM15ACBV0PMBE6XA8Q87G", - "eventId": "refreshed;NG8Z05Q8CM7KCC98PDNDQR0G920J2SGYM15ACBV0PMBE6XA8Q87G", - "timestamp": { - "t_ms": 1578334568850 - }, - "refreshReason": "pay", - "amountRefreshedEffective": "TESTKUDOS:0.06", - "amountRefreshedRaw": "TESTKUDOS:0.06", - "numInputCoins": 5, - "numOutputCoins": 2, - "numRefreshedInputCoins": 1 - }, - { - "type": "refund", - "eventId": "refund;FRW9DGXKPFS9HZEGFYMABDF6FRXDYNMFHH23FT71AAKN8FHGV2EG", - "refundGroupId": "FRW9DGXKPFS9HZEGFYMABDF6FRXDYNMFHH23FT71AAKN8FHGV2EG", - "orderShortInfo": { - "amount": "TESTKUDOS:0.5", - "orderId": "2020.006-03WSPCDEZK6HG", - "merchantBaseUrl": "https://backend.test.taler.net/public/instances/FSF/", - "proposalId": "KYSVHAENJFQB308KF6ENPM46VJRFAXFRDGW856P7MM90AW60REZ0", - "summary": "Essay: 6. Why Software Should Be Free" - }, - "timestamp": { - "t_ms": 1578334581129 - }, - "amountRefundedEffective": "TESTKUDOS:0.5", - "amountRefundedRaw": "TESTKUDOS:0.5", - "amountRefundedInvalid": "TESTKUDOS:0" - }, - { - "type": "refreshed", - "refreshGroupId": "TY8G0FDE83YJY3CWBYKMV891CADG06X8MTBZHE42XNQV2B2C95RG", - "eventId": "refreshed;TY8G0FDE83YJY3CWBYKMV891CADG06X8MTBZHE42XNQV2B2C95RG", - "timestamp": { - "t_ms": 1578334585583 - }, - "refreshReason": "refund", - "amountRefreshedEffective": "TESTKUDOS:0.5", - "amountRefreshedRaw": "TESTKUDOS:0.5", - "numInputCoins": 5, - "numOutputCoins": 6, - "numRefreshedInputCoins": 5 - } - ] -} diff --git a/contrib/wallet-testdata b/contrib/wallet-testdata new file mode 160000 +Subproject 7ca3d9b4751cbd513b3a45dfa9e337d4c5980ea |