gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-kotlin] branch master updated: Add Taler common multiplatf


From: gnunet
Subject: [taler-wallet-kotlin] branch master updated: Add Taler common multiplatform library to project
Date: Fri, 14 Aug 2020 15:13:13 +0200

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

torsten-grote pushed a commit to branch master
in repository wallet-kotlin.

The following commit(s) were added to refs/heads/master by this push:
     new 2ac13b1  Add Taler common multiplatform library to project
2ac13b1 is described below

commit 2ac13b19a5c7fc3531447333fe1772a78ca35795
Author: Torsten Grote <t@grobox.de>
AuthorDate: Fri Aug 14 10:05:51 2020 -0300

    Add Taler common multiplatform library to project
---
 .idea/.gitignore                                   |   8 +-
 .idea/codeStyles/Project.xml                       |   5 +
 .idea/compiler.xml                                 |   4 +
 .idea/modules.xml                                  |  16 --
 .idea/wallet-kotlin.iml                            |  19 +++
 build.gradle                                       | 178 +--------------------
 common/.gitignore                                  |   1 +
 common/.gradle/5.5.1/fileChanges/last-build.bin    | Bin 0 -> 1 bytes
 common/.gradle/5.5.1/fileHashes/fileHashes.lock    | Bin 0 -> 17 bytes
 common/.gradle/5.5.1/gc.properties                 |   0
 .../buildOutputCleanup/buildOutputCleanup.lock     | Bin 0 -> 17 bytes
 common/.gradle/buildOutputCleanup/cache.properties |   2 +
 common/.gradle/vcs-1/gc.properties                 |   0
 common/build.gradle                                |  99 ++++++++++++
 .../commonMain/kotlin/net/taler/common}/Amount.kt  |  50 +++---
 .../kotlin/net/taler/common}/TalerUri.kt           |   2 +-
 .../commonMain/kotlin/net/taler/common}/Time.kt    |  43 +++--
 .../commonMain/kotlin/net/taler/common/Version.kt  |  70 ++++++++
 .../kotlin/net/taler/common}/AmountTest.kt         |  52 +-----
 .../kotlin/net/taler/common}/TalerUriTest.kt       |   9 +-
 .../kotlin/net/taler/common}/TestUtils.kt          |  15 +-
 .../commonTest/kotlin/net/taler/common/TimeTest.kt |  49 ++++++
 .../kotlin/net/taler/common/VersionTest.kt         |  65 ++++++++
 .../src/jsMain/kotlin/net/taler/common/Time.kt     |  10 +-
 .../src/jvmMain/kotlin/net/taler/common/Time.kt    |   8 +-
 .../src/nativeMain/kotlin/net/taler/common/Time.kt |  10 +-
 gradle.properties                                  |   5 +-
 settings.gradle                                    |   7 +-
 wallet/.gitignore                                  |   1 +
 build.gradle => wallet/build.gradle                |  34 ++--
 .../src}/androidMain/AndroidManifest.xml           |   0
 .../kotlin/net/taler/wallet/kotlin/Db.kt           |   0
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |   0
 .../net/taler/wallet/kotlin/crypto/RsaBlinding.kt  |   0
 .../net/taler/wallet/kotlin/TestUtilsAndroid.kt    |   0
 .../net/taler/wallet/kotlin/crypto/PlanchetTest.kt |   0
 .../net/taler/wallet/kotlin/crypto/RefreshTest.kt  |   0
 .../taler/wallet/kotlin/crypto/RsaBlindingTest.kt  |   0
 .../kotlin/net/taler/wallet/kotlin/Amount.kt       |   0
 .../net/taler/wallet/kotlin/Base32Crockford.kt     |   0
 .../kotlin/net/taler/wallet/kotlin/Db.kt           |   0
 .../kotlin/net/taler/wallet/kotlin/PaytoUri.kt     |   0
 .../kotlin/net/taler/wallet/kotlin/TalerUri.kt     |   0
 .../kotlin/net/taler/wallet/kotlin/Time.kt         |   0
 .../kotlin/net/taler/wallet/kotlin/Types.kt        |   0
 .../kotlin/net/taler/wallet/kotlin/Utils.kt        |   0
 .../kotlin/net/taler/wallet/kotlin/Version.kt      |   0
 .../kotlin/net/taler/wallet/kotlin/WalletApi.kt    |   0
 .../net/taler/wallet/kotlin/crypto/Crypto.kt       |   0
 .../net/taler/wallet/kotlin/crypto/CryptoImpl.kt   |   0
 .../net/taler/wallet/kotlin/crypto/Deposit.kt      |   0
 .../kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt   |   0
 .../net/taler/wallet/kotlin/crypto/Planchet.kt     |   0
 .../net/taler/wallet/kotlin/crypto/Recoup.kt       |   0
 .../net/taler/wallet/kotlin/crypto/Refresh.kt      |   0
 .../net/taler/wallet/kotlin/crypto/Signature.kt    |   0
 .../net/taler/wallet/kotlin/exchange/Auditor.kt    |   0
 .../taler/wallet/kotlin/exchange/Denomination.kt   |   0
 .../net/taler/wallet/kotlin/exchange/Exchange.kt   |   0
 .../taler/wallet/kotlin/exchange/ExchangeRecord.kt |   0
 .../net/taler/wallet/kotlin/exchange/Keys.kt       |   0
 .../net/taler/wallet/kotlin/exchange/Wire.kt       |   0
 .../net/taler/wallet/kotlin/operations/Withdraw.kt |   0
 .../kotlin/net/taler/wallet/kotlin/AmountTest.kt   |   0
 .../net/taler/wallet/kotlin/Base32CrockfordTest.kt |   0
 .../kotlin/net/taler/wallet/kotlin/DbTest.kt       |   0
 .../kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt |   0
 .../kotlin/net/taler/wallet/kotlin/TalerUriTest.kt |   0
 .../kotlin/net/taler/wallet/kotlin/TestUtils.kt    |   0
 .../net/taler/wallet/kotlin/TimestampTest.kt       |   0
 .../kotlin/net/taler/wallet/kotlin/VersionTest.kt  |   0
 .../net/taler/wallet/kotlin/WalletApiTest.kt       |   0
 .../net/taler/wallet/kotlin/crypto/DepositTest.kt  |   0
 .../wallet/kotlin/crypto/EllipticCurveTest.kt      |   0
 .../net/taler/wallet/kotlin/crypto/KdfTest.kt      |   0
 .../net/taler/wallet/kotlin/crypto/RecoupTest.kt   |   0
 .../wallet/kotlin/crypto/RefreshPlanchetTest.kt    |   0
 .../net/taler/wallet/kotlin/crypto/Sha256Test.kt   |   0
 .../net/taler/wallet/kotlin/crypto/Sha512Test.kt   |   0
 .../taler/wallet/kotlin/crypto/SignatureTest.kt    |   0
 .../wallet/kotlin/exchange/DenominationTest.kt     |   0
 .../taler/wallet/kotlin/exchange/Denominations.kt  |   0
 .../net/taler/wallet/kotlin/exchange/KeysTest.kt   |   0
 .../net/taler/wallet/kotlin/exchange/UpdateTest.kt |   0
 .../net/taler/wallet/kotlin/exchange/WireTest.kt   |   0
 .../taler/wallet/kotlin/operations/WithdrawTest.kt |   0
 .../jsMain/kotlin/net/taler/wallet/kotlin/Db.kt    |   0
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |   0
 .../kotlin/net/taler/wallet/kotlin/TestUtils.kt    |   0
 .../src}/nativeInterop/cinterop/sodium-static.def  |   0
 .../src}/nativeInterop/cinterop/sodium.def         |   0
 .../kotlin/net/taler/wallet/kotlin/Db.kt           |   0
 .../taler/wallet/kotlin/crypto/CryptoFactory.kt    |   0
 .../kotlin/net/taler/wallet/kotlin/TestUtils.kt    |   0
 94 files changed, 432 insertions(+), 330 deletions(-)

diff --git a/.idea/.gitignore b/.idea/.gitignore
index 3127cf3..8eae92b 100644
--- a/.idea/.gitignore
+++ b/.idea/.gitignore
@@ -1,10 +1,14 @@
 # Default ignored files
 /shelf/
 /artifacts
-/modules
+/modules*
 /workspace.xml
 /gradle.xml
 /libraries
 /caches
 /runConfigurations.xml
-/encodings.xml
\ No newline at end of file
+/encodings.xml
+/vcs.xml
+/compiler.xml
+/jarRepositories.xml
+/misc.xml
\ No newline at end of file
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 61a2480..69cf9a7 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,6 +1,11 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
     <JetCodeStyleSettings>
+      <option name="PACKAGES_TO_USE_STAR_IMPORTS">
+        <value>
+          <package name="kotlinx.android.synthetic" withSubpackages="true" 
static="false" />
+        </value>
+      </option>
       <option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
       <option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" 
value="2147483647" />
       <option name="IMPORT_NESTED_CLASSES" value="true" />
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index ad4fc3c..72e41ea 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -12,6 +12,10 @@
       <entry name="!?*.clj" />
     </wildcardResourcePatterns>
     <bytecodeTargetLevel target="1.8">
+      <module name="wallet-kotlin.common.jvmMain" target="1.6" />
+      <module name="wallet-kotlin.common.jvmMain~1" target="1.6" />
+      <module name="wallet-kotlin.common.jvmTest" target="1.6" />
+      <module name="wallet-kotlin.common.jvmTest~1" target="1.6" />
       <module name="wallet-kotlin_androidMain" target="1.6" />
       <module name="wallet-kotlin_androidTest" target="1.6" />
     </bytecodeTargetLevel>
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index d8c63dd..0000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin.iml" group="wallet-kotlin" 
/>
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_androidMain.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_androidMain.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_androidTest.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_androidTest.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_commonMain.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_commonMain.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_commonTest.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_commonTest.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_jsMain.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_jsMain.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_jsTest.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_jsTest.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_linuxMain.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_linuxMain.iml" 
group="wallet-kotlin" />
-      <module 
fileurl="file://$PROJECT_DIR$/.idea/modules/wallet-kotlin_linuxTest.iml" 
filepath="$PROJECT_DIR$/.idea/modules/wallet-kotlin_linuxTest.iml" 
group="wallet-kotlin" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/.idea/wallet-kotlin.iml b/.idea/wallet-kotlin.iml
new file mode 100644
index 0000000..57eb384
--- /dev/null
+++ b/.idea/wallet-kotlin.iml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.id="wallet-kotlin" 
external.linked.project.path="$MODULE_DIR$" 
external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" 
external.system.module.group="" external.system.module.version="unspecified" 
type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="java-gradle" name="Java-Gradle">
+      <configuration>
+        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
+        <option name="BUILDABLE" value="false" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" 
inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index e0b1a1b..c6c9e9f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,181 +21,15 @@ buildscript {
         jcenter()
     }
     dependencies {
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+        classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
         classpath 'com.android.tools.build:gradle:4.0.1'
     }
 }
 
-plugins {
-    id 'org.jetbrains.kotlin.multiplatform' version "$kotlin_version"
-    id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
-}
-
-repositories {
-    mavenCentral()
-    jcenter()
-    google()
-    maven { url "https://dl.bintray.com/terl/lazysodium-maven"; }
-}
-group 'net.taler'
-version '0.0.1'
-
-apply plugin: 'com.android.library'
-apply plugin: 'maven-publish'
-
-
-kotlin {
-    android {}
-    js {
-        browser {
-        }
-        nodejs {
-        }
-    }
-    // For ARM, should be changed to iosArm32 or iosArm64
-    ios {
-        compilations.main.cinterops {
-            sodium {
-                packageName 'org.libsodium'
-                defFile 
project.file("src/nativeInterop/cinterop/sodium-static.def")
-            }
-        }
-        binaries {
-            framework {
-                baseName = "TalerWallet"
-            }
-        }
-    }
-    // For Linux, should be changed to e.g. linuxX64
-    // For MacOS, should be changed to e.g. macosX64
-    // For Windows, should be changed to e.g. mingwX64
-    linuxX64("linux") {
-        compilations.main.cinterops {
-            sodium {
-                packageName 'org.libsodium'
-            }
-        }
-    }
-    sourceSets {
-        def coroutines_version = "1.3.8"
-        def ktor_version = "1.3.2"
-        all {
-            languageSettings {
-                useExperimentalAnnotation('kotlin.ExperimentalStdlibApi')
-            }
-        }
-        commonMain {
-            dependencies {
-                implementation kotlin('stdlib-common')
-                implementation 
"org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
-                implementation "io.ktor:ktor-client-core:$ktor_version"
-                implementation "io.ktor:ktor-client-logging:$ktor_version"
-                implementation 
"io.ktor:ktor-client-serialization:$ktor_version"
-                implementation "com.soywiz.korlibs.klock:klock:1.11.12"
-            }
-        }
-        commonTest {
-            dependencies {
-                implementation kotlin('test-common')
-                implementation kotlin('test-annotations-common')
-                implementation "io.ktor:ktor-client-mock:$ktor_version"
-            }
-        }
-        androidMain {
-            dependencies {
-                implementation kotlin('stdlib-jdk8')
-                implementation 
"org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
-                implementation "io.ktor:ktor-client-android:$ktor_version"
-                implementation "io.ktor:ktor-client-logging-jvm:$ktor_version"
-                implementation 
"io.ktor:ktor-client-serialization-jvm:$ktor_version"
-                // TODO Android
-//                
implementation("com.goterl.lazycode:lazysodium-android:4.2.0@aar") {
-                implementation("com.goterl.lazycode:lazysodium-java:4.3.0") {
-                    exclude group: "org.slf4j"
-                }
-                implementation 'net.java.dev.jna:jna:5.6.0@aar'
-            }
-        }
-        androidTest {
-            dependencies {
-                implementation kotlin('test')
-                implementation kotlin('test-junit')
-                implementation "io.ktor:ktor-client-mock-jvm:$ktor_version"
-                implementation "org.slf4j:slf4j-simple:1.7.30"
-            }
-        }
-        jsMain {
-            dependencies {
-                implementation kotlin('stdlib-js')
-                implementation 
"org.jetbrains.kotlinx:kotlinx-coroutines-core-js:$coroutines_version"
-                implementation "io.ktor:ktor-client-js:$ktor_version"
-                implementation "io.ktor:ktor-client-logging-js:$ktor_version"
-                implementation 
"io.ktor:ktor-client-serialization-js:$ktor_version"
-                // bug: https://github.com/ktorio/ktor/issues/1822
-                api npm("text-encoding", '0.7.0') // work-around for above bug
-                api npm("bufferutil", '4.0.1') // work-around for above bug
-                api npm("utf-8-validate", '5.0.2') // work-around for above bug
-                api npm("abort-controller", '3.0.0') // work-around for above 
bug
-                api npm("node-fetch", '2.6.0') // work-around for above bug
-                api npm("fs", '*') // work-around for above bug
-
-                implementation npm('tweetnacl', '1.0.3')
-                implementation npm('ed2curve', '0.3.0')
-                implementation npm('hash.js', '1.1.7')
-            }
-        }
-        jsTest {
-            dependencies {
-                implementation kotlin('test-js')
-                implementation "io.ktor:ktor-client-mock-js:$ktor_version"
-            }
-        }
-        nativeMain {
-            dependsOn commonMain
-            dependencies {
-                implementation 
"org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutines_version"
-                implementation 
"io.ktor:ktor-client-logging-native:$ktor_version"
-                implementation 
"io.ktor:ktor-client-serialization-native:$ktor_version"
-            }
-        }
-        nativeTest {
-            dependsOn commonTest
-            dependencies {
-                implementation "io.ktor:ktor-client-mock-native:$ktor_version"
-            }
-        }
-        linuxMain {
-            dependsOn nativeMain
-            dependencies {
-                implementation "io.ktor:ktor-client-curl:$ktor_version"
-            }
-        }
-        iosMain {
-            dependsOn nativeMain
-            dependencies {
-                implementation "io.ktor:ktor-client-ios:$ktor_version"
-            }
-        }
-        configure([targets.linux, targets.iosArm64, targets.iosX64]) {
-            compilations.main.source(sourceSets.nativeMain)
-            compilations.test.source(sourceSets.nativeTest)
-        }
-    }
-}
-
-android {
-    compileSdkVersion 29
-    //noinspection GradleDependency
-    buildToolsVersion "29.0.2"
-
-    defaultConfig {
-        minSdkVersion 21
-        targetSdkVersion 29
-        versionCode 1
-        versionName "0.1"
-    }
-    sourceSets {
-        main {
-            manifest.srcFile 'src/androidMain/AndroidManifest.xml'
-        }
+allprojects {
+    repositories {
+        mavenCentral()
+        jcenter()
     }
 }
diff --git a/common/.gitignore b/common/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/common/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/common/.gradle/5.5.1/fileChanges/last-build.bin 
b/common/.gradle/5.5.1/fileChanges/last-build.bin
new file mode 100644
index 0000000..f76dd23
Binary files /dev/null and b/common/.gradle/5.5.1/fileChanges/last-build.bin 
differ
diff --git a/common/.gradle/5.5.1/fileHashes/fileHashes.lock 
b/common/.gradle/5.5.1/fileHashes/fileHashes.lock
new file mode 100644
index 0000000..34525bf
Binary files /dev/null and b/common/.gradle/5.5.1/fileHashes/fileHashes.lock 
differ
diff --git a/common/.gradle/5.5.1/gc.properties 
b/common/.gradle/5.5.1/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/common/.gradle/buildOutputCleanup/buildOutputCleanup.lock 
b/common/.gradle/buildOutputCleanup/buildOutputCleanup.lock
new file mode 100644
index 0000000..04431dd
Binary files /dev/null and 
b/common/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/common/.gradle/buildOutputCleanup/cache.properties 
b/common/.gradle/buildOutputCleanup/cache.properties
new file mode 100644
index 0000000..df9e847
--- /dev/null
+++ b/common/.gradle/buildOutputCleanup/cache.properties
@@ -0,0 +1,2 @@
+#Thu Jul 30 09:16:47 BRT 2020
+gradle.version=5.5.1
diff --git a/common/.gradle/vcs-1/gc.properties 
b/common/.gradle/vcs-1/gc.properties
new file mode 100644
index 0000000..e69de29
diff --git a/common/build.gradle b/common/build.gradle
new file mode 100644
index 0000000..efc1fe0
--- /dev/null
+++ b/common/build.gradle
@@ -0,0 +1,99 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+plugins {
+    id 'org.jetbrains.kotlin.multiplatform'
+    id 'org.jetbrains.kotlin.plugin.serialization'
+}
+
+group 'net.taler'
+version '0.0.1'
+
+apply plugin: 'maven-publish'
+
+kotlin {
+    jvm()
+    js {
+        browser {
+        }
+        nodejs {
+        }
+    }
+    // This is for iPhone simulator
+    // Switch here to iosArm64 (or iosArm32) to build library for iPhone device
+    ios {
+        binaries {
+            framework()
+        }
+    }
+    linuxX64("linux")
+
+    sourceSets {
+        def serialization_version = "0.20.0"
+        commonMain {
+            dependencies {
+                implementation kotlin('stdlib-common')
+                implementation 
"org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"
+            }
+        }
+        commonTest {
+            dependencies {
+                implementation kotlin('test-common')
+                implementation kotlin('test-annotations-common')
+            }
+        }
+        jvmMain {
+            dependencies {
+                implementation kotlin('stdlib-jdk8')
+                implementation 
"org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version"
+            }
+        }
+        jvmTest {
+            dependencies {
+                implementation kotlin('test')
+                implementation kotlin('test-junit')
+            }
+        }
+        jsMain {
+            dependencies {
+                implementation kotlin('stdlib-js')
+                implementation 
"org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serialization_version"
+            }
+        }
+        jsTest {
+            dependencies {
+                implementation kotlin('test-js')
+            }
+        }
+        nativeMain {
+            dependsOn commonMain
+            dependencies {
+                implementation 
"org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version"
+            }
+        }
+        nativeTest {
+            dependsOn commonTest
+        }
+        configure([targets.linux, targets.iosArm64, targets.iosX64]) {
+            compilations.main.source(sourceSets.nativeMain)
+            compilations.test.source(sourceSets.nativeTest)
+        }
+    }
+}
+
+configurations {
+    compileClasspath
+}
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt 
b/common/src/commonMain/kotlin/net/taler/common/Amount.kt
similarity index 81%
copy from src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
copy to common/src/commonMain/kotlin/net/taler/common/Amount.kt
index 2d39bb3..84d10c5 100644
--- a/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
+++ b/common/src/commonMain/kotlin/net/taler/common/Amount.kt
@@ -14,14 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
 import kotlinx.serialization.Decoder
 import kotlinx.serialization.Encoder
 import kotlinx.serialization.KSerializer
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.Serializer
-import net.taler.wallet.kotlin.crypto.CryptoImpl.Companion.toByteArray
 import kotlin.math.floor
 import kotlin.math.pow
 import kotlin.math.roundToInt
@@ -29,7 +28,7 @@ import kotlin.math.roundToInt
 class AmountParserException(msg: String? = null, cause: Throwable? = null) : 
Exception(msg, cause)
 class AmountOverflowException(msg: String? = null, cause: Throwable? = null) : 
Exception(msg, cause)
 
-@Serializable
+@Serializable(with = KotlinXAmountSerializer::class)
 data class Amount(
     /**
      * name of the currency using either a three-character ISO 4217 currency 
code,
@@ -54,17 +53,14 @@ data class Amount(
     val fraction: Int
 ) : Comparable<Amount> {
 
-    @Serializer(forClass = Amount::class)
-    companion object : KSerializer<Amount> {
+    companion object {
 
         private const val FRACTIONAL_BASE: Int = 100000000 // 1e8
 
-        @Suppress("unused")
-        private val REGEX = 
Regex("""^[-_*A-Za-z0-9]{1,12}:([0-9]+)\.?([0-9]+)?$""")
         private val REGEX_CURRENCY = Regex("""^[-_*A-Za-z0-9]{1,12}$""")
-        internal val MAX_VALUE = 2.0.pow(52).toLong()
+        val MAX_VALUE = 2.0.pow(52).toLong()
         private const val MAX_FRACTION_LENGTH = 8
-        internal const val MAX_FRACTION = 99_999_999
+        const val MAX_FRACTION = 99_999_999
 
         fun zero(currency: String): Amount {
             return Amount(checkCurrency(currency), 0, 0)
@@ -96,38 +92,25 @@ data class Amount(
         fun min(currency: String): Amount = Amount(currency, 0, 1)
         fun max(currency: String): Amount = Amount(currency, MAX_VALUE, 
MAX_FRACTION)
 
-//        fun fromJsonObject(json: JSONObject): Amount {
-//            val currency = checkCurrency(json.optString("currency"))
-//            val value = checkValue(json.optString("value").toLongOrNull())
-//            val fraction = 
checkFraction(json.optString("fraction").toIntOrNull())
-//            return Amount(currency, value, fraction)
-//        }
 
-        private fun checkCurrency(currency: String): String {
+        internal fun checkCurrency(currency: String): String {
             if (!REGEX_CURRENCY.matches(currency))
                 throw AmountParserException("Invalid currency: $currency")
             return currency
         }
 
-        private fun checkValue(value: Long?): Long {
+        internal fun checkValue(value: Long?): Long {
             if (value == null || value > MAX_VALUE)
                 throw AmountParserException("Value $value greater than 
$MAX_VALUE")
             return value
         }
 
-        private fun checkFraction(fraction: Int?): Int {
+        internal fun checkFraction(fraction: Int?): Int {
             if (fraction == null || fraction > MAX_FRACTION)
                 throw AmountParserException("Fraction $fraction greater than 
$MAX_FRACTION")
             return fraction
         }
 
-        override fun serialize(encoder: Encoder, value: Amount) {
-            encoder.encodeString(value.toJSONString())
-        }
-
-        override fun deserialize(decoder: Decoder): Amount {
-            return fromJSONString(decoder.decodeString())
-        }
     }
 
     val amountStr: String
@@ -184,12 +167,6 @@ data class Amount(
         return "$currency:$amountStr"
     }
 
-    fun toByteArray() = ByteArray(8 + 4 + 12).apply {
-        value.toByteArray().copyInto(this, 0, 0, 8)
-        fraction.toByteArray().copyInto(this, 8, 0, 4)
-        currency.encodeToByteArray().copyInto(this, 12)
-    }
-
     override fun toString(): String {
         return "$amountStr $currency"
     }
@@ -208,3 +185,14 @@ data class Amount(
     }
 
 }
+
+@Serializer(forClass = Amount::class)
+object KotlinXAmountSerializer: KSerializer<Amount> {
+    override fun serialize(encoder: Encoder, value: Amount) {
+        encoder.encodeString(value.toJSONString())
+    }
+
+    override fun deserialize(decoder: Decoder): Amount {
+        return Amount.fromJSONString(decoder.decodeString())
+    }
+}
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt 
b/common/src/commonMain/kotlin/net/taler/common/TalerUri.kt
similarity index 98%
copy from src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
copy to common/src/commonMain/kotlin/net/taler/common/TalerUri.kt
index c489d71..9f121d3 100644
--- a/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
+++ b/common/src/commonMain/kotlin/net/taler/common/TalerUri.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
 internal object TalerUri {
 
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt 
b/common/src/commonMain/kotlin/net/taler/common/Time.kt
similarity index 62%
copy from src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
copy to common/src/commonMain/kotlin/net/taler/common/Time.kt
index 4143389..37b6606 100644
--- a/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
+++ b/common/src/commonMain/kotlin/net/taler/common/Time.kt
@@ -14,24 +14,31 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
-import com.soywiz.klock.DateTime
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
-import net.taler.wallet.kotlin.Duration.Companion.FOREVER
-import net.taler.wallet.kotlin.crypto.CryptoImpl.Companion.toByteArray
+import kotlinx.serialization.builtins.serializer
+import kotlinx.serialization.json.JsonElement
+import kotlinx.serialization.json.JsonPrimitive
+import kotlinx.serialization.json.JsonTransformingSerializer
+import kotlinx.serialization.json.contentOrNull
+import kotlinx.serialization.json.longOrNull
+import net.taler.common.Duration.Companion.FOREVER
 import kotlin.math.max
 
+expect fun nowMillis(): Long
+
 @Serializable
 data class Timestamp(
     @SerialName("t_ms")
+    @Serializable(NeverSerializer::class)
     val ms: Long
 ) : Comparable<Timestamp> {
 
     companion object {
-        const val NEVER: Long = -1  // TODO or UINT64_MAX?
-        fun now(): Timestamp = Timestamp(DateTime.now().unixMillisLong)
+        const val NEVER: Long = -1
+        fun now(): Timestamp = Timestamp(nowMillis())
     }
 
     /**
@@ -42,10 +49,6 @@ data class Timestamp(
         return Timestamp((ms / 1000L) * 1000L)
     }
 
-    fun roundedToByteArray(): ByteArray = ByteArray(8).apply {
-        (truncateSeconds().ms * 1000L).toByteArray().copyInto(this)
-    }
-
     operator fun minus(other: Timestamp): Duration = when {
         ms == NEVER -> Duration(FOREVER)
         other.ms == NEVER -> throw Error("Invalid argument for timestamp 
comparision")
@@ -77,9 +80,27 @@ data class Duration(
      * Duration in milliseconds.
      */
     @SerialName("d_ms")
+    @Serializable(ForeverSerializer::class)
     val ms: Long
 ) {
     companion object {
-        const val FOREVER: Long = -1  // TODO or UINT64_MAX?
+        const val FOREVER: Long = -1
+    }
+}
+
+abstract class MinusOneSerializer(private val keyword: String) :
+    JsonTransformingSerializer<Long>(Long.serializer(), keyword) {
+
+    override fun readTransform(element: JsonElement): JsonElement {
+        return if (element.contentOrNull == keyword) return JsonPrimitive(-1)
+        else super.readTransform(element)
+    }
+
+    override fun writeTransform(element: JsonElement): JsonElement {
+        return if (element.longOrNull == -1L) return JsonPrimitive(keyword)
+        else element
     }
 }
+
+object NeverSerializer : MinusOneSerializer("never")
+object ForeverSerializer : MinusOneSerializer("forever")
diff --git a/common/src/commonMain/kotlin/net/taler/common/Version.kt 
b/common/src/commonMain/kotlin/net/taler/common/Version.kt
new file mode 100644
index 0000000..8774115
--- /dev/null
+++ b/common/src/commonMain/kotlin/net/taler/common/Version.kt
@@ -0,0 +1,70 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.common
+
+import kotlin.math.sign
+
+/**
+ * Semantic versioning, but libtool-style.
+ * See 
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
+ */
+data class Version(
+    val current: Int,
+    val revision: Int,
+    val age: Int
+) {
+    companion object {
+        fun parse(v: String): Version? {
+            val elements = v.split(":")
+            if (elements.size != 3) return null
+            val (currentStr, revisionStr, ageStr) = elements
+            val current = currentStr.toIntOrNull()
+            val revision = revisionStr.toIntOrNull()
+            val age = ageStr.toIntOrNull()
+            if (current == null || revision == null || age == null) return null
+            return Version(current, revision, age)
+        }
+    }
+
+    /**
+     * Compare two libtool-style versions.
+     *
+     * Returns a [VersionMatchResult] or null if the given version was null.
+     */
+    fun compare(other: Version?): VersionMatchResult? {
+        if (other == null) return null
+        val compatible = current - age <= other.current &&
+                current >= other.current - other.age
+        val currentCmp = sign((current - other.current).toDouble()).toInt()
+        return VersionMatchResult(compatible, currentCmp)
+    }
+
+    /**
+     * Result of comparing two libtool versions.
+     */
+    data class VersionMatchResult(
+        /**
+         * Is the first version compatible with the second?
+         */
+        val compatible: Boolean,
+        /**
+         * Is the first version older (-1), newer (+1) or identical (0)?
+         */
+        val currentCmp: Int
+    )
+
+}
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt 
b/common/src/commonTest/kotlin/net/taler/common/AmountTest.kt
similarity index 73%
copy from src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
copy to common/src/commonTest/kotlin/net/taler/common/AmountTest.kt
index 08ee618..e184307 100644
--- a/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
+++ b/common/src/commonTest/kotlin/net/taler/common/AmountTest.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
 import kotlin.random.Random
 import kotlin.test.Test
@@ -26,14 +26,7 @@ import kotlin.test.fail
 class AmountTest {
 
     companion object {
-        private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
-        fun getRandomString(minLength: Int = 1, maxLength: Int = 
Random.nextInt(0, 1337)) = (minLength..maxLength)
-            .map { Random.nextInt(0, charPool.size) }
-            .map(charPool::get)
-            .joinToString("")
-
         fun getRandomAmount() = getRandomAmount(getRandomString(1, 
Random.nextInt(1, 12)))
-
         fun getRandomAmount(currency: String): Amount {
             val value = Random.nextLong(0, Amount.MAX_VALUE)
             val fraction = Random.nextInt(0, Amount.MAX_FRACTION)
@@ -210,7 +203,10 @@ class AmountTest {
         assertTrue(Amount.fromJSONString("EUR:0") < 
Amount.fromJSONString("EUR:1"))
         assertEquals(Amount.fromJSONString("EUR:0"), 
Amount.fromJSONString("EUR:0"))
         assertEquals(Amount.fromJSONString("EUR:42"), 
Amount.fromJSONString("EUR:42"))
-        assertEquals(Amount.fromJSONString("EUR:42.00000001"), 
Amount.fromJSONString("EUR:42.00000001"))
+        assertEquals(
+            Amount.fromJSONString("EUR:42.00000001"),
+            Amount.fromJSONString("EUR:42.00000001")
+        )
         assertTrue(Amount.fromJSONString("EUR:42.00000001") >= 
Amount.fromJSONString("EUR:42.00000001"))
         assertTrue(Amount.fromJSONString("EUR:42.00000002") >= 
Amount.fromJSONString("EUR:42.00000001"))
         assertTrue(Amount.fromJSONString("EUR:42.00000002") > 
Amount.fromJSONString("EUR:42.00000001"))
@@ -223,44 +219,6 @@ class AmountTest {
         }
     }
 
-    @Test
-    fun testToByteArray() {
-        val vectors = listOf(
-            Pair("ceicWVf9GhJ:3902026702525079.40496378", 
"006XSQV3G899E0K9XKX66SB9CDBNCSHS8XM4M00"),
-            Pair("asYDLuK2A:3800267550024600.02072907", 
"006R0MNXBVHSG00ZM55P2WTS8H67AJSJ8400000"),
-            Pair("pV1m:1347558259914570.09786232", 
"002CK66VCNVMM04NADW70NHHDM0000000000000"),
-            Pair("geO82l:553744321840253.41004983", 
"000ZF855K627T0KHNYVPESAF70S6R0000000000"),
-            Pair("B9bWK7WPEO:3663912678613976.12122563", 
"006G8KS5P9HXG05RZ71M4EB2AX5KENTG8N7G000"),
-            Pair("X:1537372109907438.77850768", 
"002QCETPFYJYW153X285G000000000000000000"),
-            Pair("5:4271492725553118.39728399", 
"007JSSK6J4VXW0JY6M7KA000000000000000000"),
-            Pair("OSdV:801656289790342.08256189", 
"001DJ6H6CA4RC03XZAYMYMV4AR0000000000000"),
-            Pair("Y6:2908617536334646.94126271", 
"0055AQTB19NKC1CW82ZNJDG0000000000000000"),
-            Pair("kSHoOZj:2610656582865206.00292046", 
"004MCR6T828KC004EK76PMT8DX7NMTG00000000"),
-            Pair("GkhLXrlGES:4246330707533398.83874252", 
"007HC0Z9DFF5C17ZT764ETV89HC74V278N9G000"),
-            Pair("CNS09:738124490298524.71259462", 
"0019YMG01DA9R11ZAN346KJK60WG00000000000"),
-            Pair("sw0b1tKXZym:2132978464977419.28199478", 
"003S7VNZPZS0P0DE98V76XSGC8RQ8JTRB9WPT00"),
-            Pair("fC:1275322307696988.17178522", 
"0028FSGX3ZCNR0863YD6CGR0000000000000000"),
-            Pair("cRai6j:166032749022734.69444771", 
"0009E0C30V70W113MJHP6MK1D4V6M0000000000"),
-            Pair("KOADwTb3:3932974019564218.48282023", 
"006ZJ16ZB39BM0Q0Q6KMPKT18HVN8RHK0000000"),
-            Pair("9Fi9wcLgDe:1268366772151214.97268853", 
"002834N6WRHTW1EC6HTKJHK975VP6K378HJG000"),
-            Pair("SDN:3370670470236379.88943272", 
"005ZK6V0124DP1AD5AM56H2E000000000000000"),
-            Pair("zGCP5V:4010014441349620.76121145", 
"0073Y5HYA8GZ8149GGWQMHT3A0TNC0000000000"),
-            Pair("VsW1JjBLn:2037070181191907.99717275", 
"003KSD2WH18E61FHJ2DNCWTQ6556MGJCDR00000"),
-            Pair("A:1806895799429502.00887758", 
"0036PQ5P8NMQW00DHF742000000000000000000"),
-            Pair("njA8:4015261148004966.43708687", 
"00747PYPD116C0MTY47PWTJ1700000000000000"),
-            Pair("Bwq:3562876074139250.28829179", 
"006AGTNTRWF740DQWQXM4XVH000000000000000"),
-            Pair("8e75v8:3716241006992995.95213823", 
"006K7SP93WF661DCV3ZKGS9Q6NV3G0000000000"),
-            Pair("XrnbQTTn:3887603772953949.94721267", 
"006WZGA9X8ANT1D5AKSNGWKEC98N8N3E0000000"),
-            Pair("MIN:0.00000001", "0000000000000000000MTJAE000000000000000"),
-            Pair("MAX:4503599627370496.99999999", 
"00800000000001FNW3ZMTGAR000000000000000")
-        )
-        for (v in vectors) {
-            val amount = Amount.fromJSONString(v.first)
-            val encodedBytes = Base32Crockford.encode(amount.toByteArray())
-            assertEquals(v.second, encodedBytes)
-        }
-    }
-
     private inline fun <reified T : Throwable> assertThrows(
         msg: String? = null,
         function: () -> Any
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt 
b/common/src/commonTest/kotlin/net/taler/common/TalerUriTest.kt
similarity index 90%
copy from src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
copy to common/src/commonTest/kotlin/net/taler/common/TalerUriTest.kt
index cfcc8bd..f996fa9 100644
--- a/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
+++ b/common/src/commonTest/kotlin/net/taler/common/TalerUriTest.kt
@@ -14,10 +14,10 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
-import net.taler.wallet.kotlin.TalerUri.WithdrawUriResult
-import net.taler.wallet.kotlin.TalerUri.parseWithdrawUri
+import net.taler.common.TalerUri.WithdrawUriResult
+import net.taler.common.TalerUri.parseWithdrawUri
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertNull
@@ -38,7 +38,8 @@ class TalerUriTest {
 
         // correct parsing with long path
         uri = "taler://withdraw/bank.example.com/foo/bar/23/42/1337/1234567890"
-        expected = 
WithdrawUriResult("https://bank.example.com/foo/bar/23/42/1337";, "1234567890")
+        expected =
+            WithdrawUriResult("https://bank.example.com/foo/bar/23/42/1337";, 
"1234567890")
         assertEquals(expected, parseWithdrawUri(uri))
 
         // rejects incorrect scheme
diff --git a/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/common/src/commonTest/kotlin/net/taler/common/TestUtils.kt
similarity index 67%
copy from src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
copy to common/src/commonTest/kotlin/net/taler/common/TestUtils.kt
index 49466e0..e3a6c17 100644
--- a/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
+++ b/common/src/commonTest/kotlin/net/taler/common/TestUtils.kt
@@ -14,12 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.promise
+import kotlin.random.Random
 
-actual fun runCoroutine(block: suspend (scope : CoroutineScope) -> Unit): 
dynamic = GlobalScope.promise { block(this) }
-
-actual fun getPlatformTarget(): PlatformTarget = PlatformTarget.JS
+private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
+fun getRandomString(minLength: Int = 1, maxLength: Int = Random.nextInt(0, 
1337)) =
+    (minLength..maxLength)
+        .map { Random.nextInt(0, charPool.size) }
+        .map(charPool::get)
+        .joinToString("")
diff --git a/common/src/commonTest/kotlin/net/taler/common/TimeTest.kt 
b/common/src/commonTest/kotlin/net/taler/common/TimeTest.kt
new file mode 100644
index 0000000..3ee0a99
--- /dev/null
+++ b/common/src/commonTest/kotlin/net/taler/common/TimeTest.kt
@@ -0,0 +1,49 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.common
+
+import kotlinx.serialization.UnstableDefault
+import kotlinx.serialization.json.Json.Default.parse
+import kotlinx.serialization.json.Json.Default.stringify
+import net.taler.common.Timestamp.Companion.NEVER
+import kotlin.random.Random
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+// TODO test other functionality of Timestamp and Duration
+@UnstableDefault
+class TimeTest {
+
+    @Test
+    fun testSerialize() {
+        for (i in 0 until 42) {
+            val t = Random.nextLong()
+            assertEquals("""{"t_ms":$t}""", stringify(Timestamp.serializer(), 
Timestamp(t)))
+        }
+        assertEquals("""{"t_ms":"never"}""", stringify(Timestamp.serializer(), 
Timestamp(NEVER)))
+    }
+
+    @Test
+    fun testDeserialize() {
+        for (i in 0 until 42) {
+            val t = Random.nextLong()
+            assertEquals(Timestamp(t), parse(Timestamp.serializer(), """{ 
"t_ms": $t }"""))
+        }
+        assertEquals(Timestamp(NEVER), parse(Timestamp.serializer(), """{ 
"t_ms": "never" }"""))
+    }
+
+}
diff --git a/common/src/commonTest/kotlin/net/taler/common/VersionTest.kt 
b/common/src/commonTest/kotlin/net/taler/common/VersionTest.kt
new file mode 100644
index 0000000..f4f17ea
--- /dev/null
+++ b/common/src/commonTest/kotlin/net/taler/common/VersionTest.kt
@@ -0,0 +1,65 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.common
+
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertNull
+
+class VersionTest {
+
+    @Test
+    fun testParse() {
+        assertNull(Version.parse(""))
+        assertNull(Version.parse("foo"))
+        assertNull(Version.parse("foo:bar:foo"))
+        assertNull(Version.parse("0:0:0:"))
+        assertNull(Version.parse("0:0:"))
+        assertEquals(Version(0, 0, 0), Version.parse("0:0:0"))
+        assertEquals(Version(1, 2, 3), Version.parse("1:2:3"))
+        assertEquals(Version(1337, 42, 23), Version.parse("1337:42:23"))
+    }
+
+    @Test
+    fun testComparision() {
+        assertEquals(
+            Version.VersionMatchResult(true, 0),
+            Version.parse("0:0:0")!!.compare(Version.parse("0:0:0"))
+        )
+        assertEquals(
+            Version.VersionMatchResult(true, -1),
+            Version.parse("0:0:0")!!.compare(Version.parse("1:0:1"))
+        )
+        assertEquals(
+            Version.VersionMatchResult(true, -1),
+            Version.parse("0:0:0")!!.compare(Version.parse("1:5:1"))
+        )
+        assertEquals(
+            Version.VersionMatchResult(false, -1),
+            Version.parse("0:0:0")!!.compare(Version.parse("1:5:0"))
+        )
+        assertEquals(
+            Version.VersionMatchResult(false, 1),
+            Version.parse("1:0:0")!!.compare(Version.parse("0:5:0"))
+        )
+        assertEquals(
+            Version.VersionMatchResult(true, 0),
+            Version.parse("1:0:1")!!.compare(Version.parse("1:5:1"))
+        )
+    }
+
+}
diff --git a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/common/src/jsMain/kotlin/net/taler/common/Time.kt
similarity index 85%
copy from src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
copy to common/src/jsMain/kotlin/net/taler/common/Time.kt
index 45cbfc3..b114022 100644
--- a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/common/src/jsMain/kotlin/net/taler/common/Time.kt
@@ -14,10 +14,10 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
-internal actual class DbFactory {
-    actual fun openDb(): Db {
-        return FakeDb()
-    }
+import kotlin.js.Date
+
+actual fun nowMillis(): Long {
+    return Date().getMilliseconds().toLong()
 }
diff --git a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/common/src/jvmMain/kotlin/net/taler/common/Time.kt
similarity index 85%
copy from src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
copy to common/src/jvmMain/kotlin/net/taler/common/Time.kt
index 45cbfc3..6cd9040 100644
--- a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/common/src/jvmMain/kotlin/net/taler/common/Time.kt
@@ -14,10 +14,8 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
-internal actual class DbFactory {
-    actual fun openDb(): Db {
-        return FakeDb()
-    }
+actual fun nowMillis(): Long {
+    return System.currentTimeMillis()
 }
diff --git a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/common/src/nativeMain/kotlin/net/taler/common/Time.kt
similarity index 85%
copy from src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
copy to common/src/nativeMain/kotlin/net/taler/common/Time.kt
index 45cbfc3..8a4091a 100644
--- a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/common/src/nativeMain/kotlin/net/taler/common/Time.kt
@@ -14,10 +14,10 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.common
 
-internal actual class DbFactory {
-    actual fun openDb(): Db {
-        return FakeDb()
-    }
+import kotlin.system.getTimeMillis
+
+actual fun nowMillis(): Long {
+    return getTimeMillis()
 }
diff --git a/gradle.properties b/gradle.properties
index 29e08e8..aaf152a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1 +1,4 @@
-kotlin.code.style=official
\ No newline at end of file
+kotlin.code.style=official
+
+# prevent parallel execution of several compiler instances
+kotlin.native.disableCompilerDaemon=true
diff --git a/settings.gradle b/settings.gradle
index bf5e773..b22748a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,6 @@
-rootProject.name = 'wallet-kotlin'
-
 enableFeaturePreview("GRADLE_METADATA")
+
+include ':common'
+project(':common').projectDir = file('./common')
+
+include ':wallet'
diff --git a/wallet/.gitignore b/wallet/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/wallet/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/build.gradle b/wallet/build.gradle
similarity index 93%
copy from build.gradle
copy to wallet/build.gradle
index e0b1a1b..aacd0b3 100644
--- a/build.gradle
+++ b/wallet/build.gradle
@@ -14,37 +14,24 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-buildscript {
-    ext.kotlin_version = '1.3.72'
-    repositories {
-        google()
-        jcenter()
-    }
-    dependencies {
-        classpath 'com.android.tools.build:gradle:4.0.1'
-    }
-}
-
 plugins {
-    id 'org.jetbrains.kotlin.multiplatform' version "$kotlin_version"
-    id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
+    id 'org.jetbrains.kotlin.multiplatform'
+    id 'org.jetbrains.kotlin.plugin.serialization'
 }
 
-repositories {
-    mavenCentral()
-    jcenter()
-    google()
-    maven { url "https://dl.bintray.com/terl/lazysodium-maven"; }
-}
 group 'net.taler'
 version '0.0.1'
 
 apply plugin: 'com.android.library'
 apply plugin: 'maven-publish'
 
-
 kotlin {
-    android {}
+    android {
+        repositories {
+            google()
+            maven { url "https://dl.bintray.com/terl/lazysodium-maven"; }
+        }
+    }
     js {
         browser {
         }
@@ -75,6 +62,7 @@ kotlin {
             }
         }
     }
+
     sourceSets {
         def coroutines_version = "1.3.8"
         def ktor_version = "1.3.2"
@@ -82,10 +70,14 @@ kotlin {
             languageSettings {
                 useExperimentalAnnotation('kotlin.ExperimentalStdlibApi')
             }
+            dependencies {
+            }
         }
         commonMain {
             dependencies {
                 implementation kotlin('stdlib-common')
+                implementation project(":common")
+
                 implementation 
"org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
                 implementation "io.ktor:ktor-client-core:$ktor_version"
                 implementation "io.ktor:ktor-client-logging:$ktor_version"
diff --git a/src/androidMain/AndroidManifest.xml 
b/wallet/src/androidMain/AndroidManifest.xml
similarity index 100%
rename from src/androidMain/AndroidManifest.xml
rename to wallet/src/androidMain/AndroidManifest.xml
diff --git a/src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt
similarity index 100%
rename from src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt
diff --git 
a/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
similarity index 100%
rename from 
src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
rename to 
wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
diff --git 
a/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt 
b/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
similarity index 100%
rename from src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
rename to 
wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
diff --git a/src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt 
b/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt
similarity index 100%
rename from src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt
diff --git 
a/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt 
b/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt
similarity index 100%
rename from 
src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt
diff --git 
a/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt 
b/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt
similarity index 100%
rename from src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt
diff --git 
a/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt 
b/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
similarity index 100%
rename from 
src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt
diff --git 
a/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt
similarity index 100%
rename from 
src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt
diff --git 
a/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt
similarity index 100%
rename from 
src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt
diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt
rename to wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt
diff --git 
a/src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt
similarity index 100%
rename from src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt
similarity index 100%
rename from 
src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt
similarity index 100%
rename from 
src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt
similarity index 100%
rename from 
src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt
similarity index 100%
rename from 
src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt
similarity index 100%
rename from 
src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt
similarity index 100%
rename from src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt
diff --git 
a/src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt
similarity index 100%
rename from 
src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt
diff --git a/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
similarity index 100%
rename from src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
diff --git a/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
similarity index 100%
rename from src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
rename to 
wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
diff --git a/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/wallet/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
similarity index 100%
rename from src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
rename to wallet/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
diff --git a/src/nativeInterop/cinterop/sodium-static.def 
b/wallet/src/nativeInterop/cinterop/sodium-static.def
similarity index 100%
rename from src/nativeInterop/cinterop/sodium-static.def
rename to wallet/src/nativeInterop/cinterop/sodium-static.def
diff --git a/src/nativeInterop/cinterop/sodium.def 
b/wallet/src/nativeInterop/cinterop/sodium.def
similarity index 100%
rename from src/nativeInterop/cinterop/sodium.def
rename to wallet/src/nativeInterop/cinterop/sodium.def
diff --git a/src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt
similarity index 100%
rename from src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt
diff --git 
a/src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
similarity index 100%
rename from 
src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
rename to 
wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
diff --git a/src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/wallet/src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
similarity index 100%
rename from src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
rename to wallet/src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt

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



reply via email to

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