From bc03368d2dcb1a5f9e92b412d34fc6d95fc186ba Mon Sep 17 00:00:00 2001
From: Jono Wenger <jono@elixxir.io>
Date: Fri, 19 Aug 2022 12:36:22 -0700
Subject: [PATCH] Fix Throw to accept an error type and include the stack trace
 in the error

---
 README.md                       |  2 +-
 go.mod                          | 20 ++++++++++++++++++--
 go.sum                          | 23 +++++++++++++++++++++++
 test/assets/wasm_exec.js        |  2 +-
 wasm/authenticatedConnection.go |  2 +-
 wasm/backup.go                  |  8 ++++----
 wasm/broadcast.go               | 10 +++++-----
 wasm/cmix.go                    |  4 ++--
 wasm/connect.go                 |  8 ++++----
 wasm/delivery.go                |  2 +-
 wasm/dummy.go                   |  4 ++--
 wasm/e2e.go                     |  6 +++---
 wasm/e2eAuth.go                 | 24 ++++++++++++------------
 wasm/e2eHandler.go              | 16 ++++++++--------
 wasm/errors.go                  |  2 +-
 wasm/fileTransfer.go            | 12 ++++++------
 wasm/follow.go                  |  6 +++---
 wasm/group.go                   | 18 +++++++++---------
 wasm/identity.go                | 16 ++++++++--------
 wasm/logging.go                 |  2 +-
 wasm/ndf.go                     |  2 +-
 wasm/restlike.go                |  4 ++--
 wasm/restlikeSingle.go          |  4 ++--
 wasm/single.go                  |  4 ++--
 wasm/ud.go                      | 18 +++++++++---------
 wasm/utils.go                   |  9 +++++++--
 wasm/wasm_js.s                  |  2 +-
 27 files changed, 137 insertions(+), 93 deletions(-)

diff --git a/README.md b/README.md
index 84a3e484..e2eff1d7 100644
--- a/README.md
+++ b/README.md
@@ -65,7 +65,7 @@ global.Go = class {
             go: {
                 // ...
                 // func Throw(exception string, message string)
-                'gitlab.com/elixxir/xxdk-wasm/wasm.Throw': (sp) => {
+                'gitlab.com/elixxir/xxdk-wasm/wasm.throw': (sp) => {
                     const exception = loadString(sp + 8)
                     const message = loadString(sp + 24)
                     throw globalThis[exception](message)
diff --git a/go.mod b/go.mod
index 6513eb8d..9da4c801 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.17
 
 require (
 	github.com/spf13/jwalterweatherman v1.1.0
-	gitlab.com/elixxir/client v1.5.1-0.20220812185448-678f627877c6
+	gitlab.com/elixxir/client v1.5.1-0.20220819191805-0a3f0ec5e022
 )
 
 require (
@@ -12,15 +12,28 @@ require (
 	github.com/badoux/checkmail v1.2.1 // indirect
 	github.com/cloudflare/circl v1.2.0 // indirect
 	github.com/elliotchance/orderedmap v1.4.0 // indirect
+	github.com/fsnotify/fsnotify v1.5.4 // indirect
 	github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/google/go-cmp v0.5.8 // indirect
+	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 	github.com/klauspost/cpuid/v2 v2.1.0 // indirect
+	github.com/magiconair/properties v1.8.6 // indirect
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
+	github.com/pelletier/go-toml v1.9.5 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
+	github.com/spf13/afero v1.9.2 // indirect
+	github.com/spf13/cast v1.5.0 // indirect
+	github.com/spf13/cobra v1.5.0 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/spf13/viper v1.12.0 // indirect
 	github.com/stretchr/testify v1.7.2 // indirect
+	github.com/subosito/gotenv v1.4.0 // indirect
 	github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 // indirect
 	github.com/ttacon/libphonenumber v1.2.1 // indirect
 	github.com/tyler-smith/go-bip39 v1.1.0 // indirect
@@ -28,7 +41,7 @@ require (
 	gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f // indirect
 	gitlab.com/elixxir/comms v0.0.4-0.20220603231314-e47e4af13326 // indirect
 	gitlab.com/elixxir/crypto v0.0.7-0.20220606201132-c370d5039cea // indirect
-	gitlab.com/elixxir/ekv v0.1.7 // indirect
+	gitlab.com/elixxir/ekv v0.1.8-0.20220819191231-b09ccfc34bdd // indirect
 	gitlab.com/elixxir/primitives v0.0.3-0.20220606195757-40f7a589347f // indirect
 	gitlab.com/xx_network/comms v0.0.4-0.20220630163702-f3d372ef6acd // indirect
 	gitlab.com/xx_network/crypto v0.0.5-0.20220729193517-1e5e96f39f6e // indirect
@@ -42,4 +55,7 @@ require (
 	google.golang.org/genproto v0.0.0-20220802133213-ce4fa296bf78 // indirect
 	google.golang.org/grpc v1.48.0 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
+	gopkg.in/ini.v1 v1.66.6 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index 3245ed75..fffda699 100644
--- a/go.sum
+++ b/go.sum
@@ -125,6 +125,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL
 github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -246,6 +247,7 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
@@ -254,6 +256,7 @@ github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpT
 github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -283,6 +286,7 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea h1:uyJ13zfy6l79CM3HnVhDalIyZ4RJAyVfDrbnfFeJoC4=
 github.com/liyue201/goqr v0.0.0-20200803022322-df443203d4ea/go.mod h1:w4pGU9PkiX2hAWyF0yuHEHmYTQFAd6WHzp6+IY7JVjE=
+github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
 github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -305,6 +309,7 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -318,8 +323,10 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
 github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
+github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw=
 github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -362,12 +369,17 @@ github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1
 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
+github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
 github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
+github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
 github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
+github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
 github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ=
 github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -381,6 +393,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
 github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
 github.com/subosito/gotenv v1.3.0/go.mod h1:YzJjq/33h7nrwdY+iHMhEOEEbW0ovIz0tB6t6PwAXzs=
+github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs=
 github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo=
 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0XS0qTf5FznsMOzTjGqavBGuCbo0=
 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w=
@@ -409,6 +422,10 @@ gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f h1:yXGvNBqzZwA
 gitlab.com/elixxir/bloomfilter v0.0.0-20211222005329-7d931ceead6f/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k=
 gitlab.com/elixxir/client v1.5.1-0.20220812185448-678f627877c6 h1:ddw+h7J1eErTk1wyL08h/AYn82oGdD25fygqjGqzfFU=
 gitlab.com/elixxir/client v1.5.1-0.20220812185448-678f627877c6/go.mod h1:FwCS+R8IxQCgP9aicIJwTllJhjeFakMY+E7OHlgQe5I=
+gitlab.com/elixxir/client v1.5.1-0.20220819183619-ee6ed55cc2c2 h1:V9t1+3TrvMhvqY7UjHSFVmpR9RkVZZkLkbZUvQROk0g=
+gitlab.com/elixxir/client v1.5.1-0.20220819183619-ee6ed55cc2c2/go.mod h1:43aEEoQg6N0wViL80TMT6ULeNja6t+YhAcdxFvoSba8=
+gitlab.com/elixxir/client v1.5.1-0.20220819191805-0a3f0ec5e022 h1:bpJYaiwuM55p5FrRwdIExxDDJmOnEcFNmKNBj0wh3qc=
+gitlab.com/elixxir/client v1.5.1-0.20220819191805-0a3f0ec5e022/go.mod h1:N/9levnzqNI6iBBSZDejHQ4n3mhExyR/isLUFrfon/U=
 gitlab.com/elixxir/comms v0.0.4-0.20220603231314-e47e4af13326 h1:Zid8oNHtbOqF6ebrcGIccvIMabFNGh9dzY1b7mgIcF0=
 gitlab.com/elixxir/comms v0.0.4-0.20220603231314-e47e4af13326/go.mod h1:tlHSrtSliKWUxsck8z/Ql/VJkMdSONV2BeWaUAAXzgk=
 gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c=
@@ -418,6 +435,10 @@ gitlab.com/elixxir/crypto v0.0.7-0.20220606201132-c370d5039cea h1:+FjwbKl6X9TDT7
 gitlab.com/elixxir/crypto v0.0.7-0.20220606201132-c370d5039cea/go.mod h1:Oy+VWQ2Sa0Ybata3oTV+Yc46hkaDwAsuIMW0wJ01z2M=
 gitlab.com/elixxir/ekv v0.1.7 h1:OW2z+N4QCqqMFzouAwFTWWMKz0Y/PDhyYReN7gQ5NiQ=
 gitlab.com/elixxir/ekv v0.1.7/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
+gitlab.com/elixxir/ekv v0.1.8-0.20220819182720-9469c5593e46 h1:/1YYi6J8WnLP5zt9OUAhh2I3uLK6RcugPxl9DTEt9WY=
+gitlab.com/elixxir/ekv v0.1.8-0.20220819182720-9469c5593e46/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
+gitlab.com/elixxir/ekv v0.1.8-0.20220819191231-b09ccfc34bdd h1:0TKp/keclGT063K3Q8oDKQb54tRGfcdBqeMfgNwReeI=
+gitlab.com/elixxir/ekv v0.1.8-0.20220819191231-b09ccfc34bdd/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4=
 gitlab.com/elixxir/primitives v0.0.0-20200731184040-494269b53b4d/go.mod h1:OQgUZq7SjnE0b+8+iIAT2eqQF+2IFHn73tOo+aV11mg=
 gitlab.com/elixxir/primitives v0.0.0-20200804170709-a1896d262cd9/go.mod h1:p0VelQda72OzoUckr1O+vPW0AiFe0nyKQ6gYcmFSuF8=
 gitlab.com/elixxir/primitives v0.0.0-20200804182913-788f47bded40/go.mod h1:tzdFFvb1ESmuTCOl1z6+yf6oAICDxH2NPUemVgoNLxc=
@@ -951,6 +972,7 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/ini.v1 v1.66.4/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI=
 gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -959,6 +981,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/test/assets/wasm_exec.js b/test/assets/wasm_exec.js
index b3783862..0fc07d61 100644
--- a/test/assets/wasm_exec.js
+++ b/test/assets/wasm_exec.js
@@ -503,7 +503,7 @@
 					},
 
 					// func Throw(exception string, message string)
-					'gitlab.com/elixxir/xxdk-wasm/wasm.Throw': (sp) => {
+					'gitlab.com/elixxir/xxdk-wasm/wasm.throw': (sp) => {
 						const exception = loadString(sp + 8)
 						const message = loadString(sp + 24)
 						throw globalThis[exception](message)
diff --git a/wasm/authenticatedConnection.go b/wasm/authenticatedConnection.go
index dceea6f0..38f7232f 100644
--- a/wasm/authenticatedConnection.go
+++ b/wasm/authenticatedConnection.go
@@ -55,7 +55,7 @@ func (c *Cmix) ConnectWithAuthentication(_ js.Value, args []js.Value) interface{
 	ac, err := c.api.ConnectWithAuthentication(
 		args[0].Int(), recipientContact, e2eParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/backup.go b/wasm/backup.go
index c715cfca..b313e6b1 100644
--- a/wasm/backup.go
+++ b/wasm/backup.go
@@ -75,7 +75,7 @@ func NewCmixFromBackup(_ js.Value, args []js.Value) interface{} {
 	report, err := bindings.NewCmixFromBackup(ndfJSON, storageDir,
 		backupPassphrase, sessionPassword, backupFileContents)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -105,7 +105,7 @@ func InitializeBackup(_ js.Value, args []js.Value) interface{} {
 	api, err := bindings.InitializeBackup(
 		args[0].Int(), args[1].Int(), args[2].String(), cb)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -133,7 +133,7 @@ func ResumeBackup(_ js.Value, args []js.Value) interface{} {
 	cb := &updateBackupFunc{WrapCB(args[2], "UpdateBackup")}
 	api, err := bindings.ResumeBackup(args[0].Int(), args[1].Int(), cb)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -148,7 +148,7 @@ func ResumeBackup(_ js.Value, args []js.Value) interface{} {
 func (b *Backup) StopBackup(js.Value, []js.Value) interface{} {
 	err := b.api.StopBackup()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/broadcast.go b/wasm/broadcast.go
index 53065426..14d6dad3 100644
--- a/wasm/broadcast.go
+++ b/wasm/broadcast.go
@@ -52,7 +52,7 @@ func NewBroadcastChannel(_ js.Value, args []js.Value) interface{} {
 
 	api, err := bindings.NewBroadcastChannel(args[0].Int(), channelDefinition)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -84,7 +84,7 @@ func (c *Channel) Listen(_ js.Value, args []js.Value) interface{} {
 	err := c.api.Listen(
 		&broadcastListener{WrapCB(args[0], "Callback")}, args[1].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -104,7 +104,7 @@ func (c *Channel) Listen(_ js.Value, args []js.Value) interface{} {
 func (c *Channel) Broadcast(_ js.Value, args []js.Value) interface{} {
 	report, err := c.api.Broadcast(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -126,7 +126,7 @@ func (c *Channel) BroadcastAsymmetric(_ js.Value, args []js.Value) interface{} {
 	report, err := c.api.BroadcastAsymmetric(
 		CopyBytesToGo(args[0]), CopyBytesToGo(args[1]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -159,7 +159,7 @@ func (c *Channel) MaxAsymmetricPayloadSize(js.Value, []js.Value) interface{} {
 func (c *Channel) Get(js.Value, []js.Value) interface{} {
 	def, err := c.api.Get()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/cmix.go b/wasm/cmix.go
index e11c2c35..81097af8 100644
--- a/wasm/cmix.go
+++ b/wasm/cmix.go
@@ -79,7 +79,7 @@ func NewCmix(_ js.Value, args []js.Value) interface{} {
 	err := bindings.NewCmix(
 		args[0].String(), args[1].String(), password, args[3].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -110,7 +110,7 @@ func LoadCmix(_ js.Value, args []js.Value) interface{} {
 
 	net, err := bindings.LoadCmix(args[0].String(), password, cmixParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/connect.go b/wasm/connect.go
index 274be8ba..6060586e 100644
--- a/wasm/connect.go
+++ b/wasm/connect.go
@@ -63,7 +63,7 @@ func (c *Cmix) Connect(_ js.Value, args []js.Value) interface{} {
 	e2eParamsJSON := CopyBytesToGo(args[2])
 	api, err := c.api.Connect(args[0].Int(), recipientContact, e2eParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -88,7 +88,7 @@ func (c *Cmix) Connect(_ js.Value, args []js.Value) interface{} {
 func (c *Connection) SendE2E(_ js.Value, args []js.Value) interface{} {
 	sendReport, err := c.api.SendE2E(args[0].Int(), CopyBytesToGo(args[1]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 	return CopyBytesToJS(sendReport)
@@ -101,7 +101,7 @@ func (c *Connection) SendE2E(_ js.Value, args []js.Value) interface{} {
 func (c *Connection) Close(js.Value, []js.Value) interface{} {
 	err := c.api.Close()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -139,7 +139,7 @@ func (c *Connection) RegisterListener(_ js.Value, args []js.Value) interface{} {
 	err := c.api.RegisterListener(args[0].Int(),
 		&listener{WrapCB(args[1], "Hear"), WrapCB(args[1], "Name")})
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/delivery.go b/wasm/delivery.go
index ed2c55ea..5c002c84 100644
--- a/wasm/delivery.go
+++ b/wasm/delivery.go
@@ -53,7 +53,7 @@ func (c *Cmix) WaitForRoundResult(_ js.Value, args []js.Value) interface{} {
 
 	err := c.api.WaitForRoundResult(roundList, mdc, args[2].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/dummy.go b/wasm/dummy.go
index 33b9b811..dbea1f85 100644
--- a/wasm/dummy.go
+++ b/wasm/dummy.go
@@ -56,7 +56,7 @@ func NewDummyTrafficManager(_ js.Value, args []js.Value) interface{} {
 	dt, err := bindings.NewDummyTrafficManager(
 		args[0].Int(), args[1].Int(), args[2].Int(), args[3].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -80,7 +80,7 @@ func NewDummyTrafficManager(_ js.Value, args []js.Value) interface{} {
 func (dt *DummyTraffic) SetStatus(_ js.Value, args []js.Value) interface{} {
 	err := dt.api.SetStatus(args[0].Bool())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/e2e.go b/wasm/e2e.go
index 27c71a51..bc9fe489 100644
--- a/wasm/e2e.go
+++ b/wasm/e2e.go
@@ -97,7 +97,7 @@ func Login(_ js.Value, args []js.Value) interface{} {
 	newE2E, err := bindings.Login(
 		args[0].Int(), callbacks, identity, e2eParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -127,7 +127,7 @@ func LoginEphemeral(_ js.Value, args []js.Value) interface{} {
 	newE2E, err := bindings.LoginEphemeral(
 		args[0].Int(), callbacks, identity, e2eParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -168,7 +168,7 @@ func (e *E2e) GetUdCertFromNdf(js.Value, []js.Value) interface{} {
 func (e *E2e) GetUdContactFromNdf(js.Value, []js.Value) interface{} {
 	b, err := e.api.GetUdContactFromNdf()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/e2eAuth.go b/wasm/e2eAuth.go
index 5093228d..8fddd96f 100644
--- a/wasm/e2eAuth.go
+++ b/wasm/e2eAuth.go
@@ -43,7 +43,7 @@ func (e *E2e) Request(_ js.Value, args []js.Value) interface{} {
 	factsListJson := CopyBytesToGo(args[1])
 	rid, err := e.api.Request(partnerContact, factsListJson)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -76,7 +76,7 @@ func (e *E2e) Confirm(_ js.Value, args []js.Value) interface{} {
 	partnerContact := CopyBytesToGo(args[0])
 	rid, err := e.api.Confirm(partnerContact)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -107,7 +107,7 @@ func (e *E2e) Reset(_ js.Value, args []js.Value) interface{} {
 	partnerContact := CopyBytesToGo(args[0])
 	rid, err := e.api.Reset(partnerContact)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -132,7 +132,7 @@ func (e *E2e) ReplayConfirm(_ js.Value, args []js.Value) interface{} {
 	partnerContact := CopyBytesToGo(args[0])
 	rid, err := e.api.ReplayConfirm(partnerContact)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -157,7 +157,7 @@ func (e *E2e) DeleteRequest(_ js.Value, args []js.Value) interface{} {
 	partnerContact := CopyBytesToGo(args[0])
 	err := e.api.DeleteRequest(partnerContact)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -171,7 +171,7 @@ func (e *E2e) DeleteRequest(_ js.Value, args []js.Value) interface{} {
 func (e *E2e) DeleteAllRequests(js.Value, []js.Value) interface{} {
 	err := e.api.DeleteAllRequests()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -185,7 +185,7 @@ func (e *E2e) DeleteAllRequests(js.Value, []js.Value) interface{} {
 func (e *E2e) DeleteSentRequests(js.Value, []js.Value) interface{} {
 	err := e.api.DeleteSentRequests()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -199,7 +199,7 @@ func (e *E2e) DeleteSentRequests(js.Value, []js.Value) interface{} {
 func (e *E2e) DeleteReceiveRequests(js.Value, []js.Value) interface{} {
 	err := e.api.DeleteReceiveRequests()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -218,7 +218,7 @@ func (e *E2e) GetReceivedRequest(_ js.Value, args []js.Value) interface{} {
 	partnerContact := CopyBytesToGo(args[0])
 	c, err := e.api.GetReceivedRequest(partnerContact)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -241,7 +241,7 @@ func (e *E2e) VerifyOwnership(_ js.Value, args []js.Value) interface{} {
 	isValid, err := e.api.VerifyOwnership(
 		receivedContact, verifiedContact, args[2].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -263,7 +263,7 @@ func (e *E2e) AddPartnerCallback(_ js.Value, args []js.Value) interface{} {
 	callbacks := newAuthCallbacks(args[1])
 	err := e.api.AddPartnerCallback(partnerID, callbacks)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -282,7 +282,7 @@ func (e *E2e) DeletePartnerCallback(_ js.Value, args []js.Value) interface{} {
 	partnerID := CopyBytesToGo(args[0])
 	err := e.api.DeletePartnerCallback(partnerID)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/e2eHandler.go b/wasm/e2eHandler.go
index a6968818..f2e01815 100644
--- a/wasm/e2eHandler.go
+++ b/wasm/e2eHandler.go
@@ -30,7 +30,7 @@ func (e *E2e) GetReceptionID(js.Value, []js.Value) interface{} {
 func (e *E2e) GetAllPartnerIDs(js.Value, []js.Value) interface{} {
 	partnerIDs, err := e.api.GetAllPartnerIDs()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 	return CopyBytesToJS(partnerIDs)
@@ -83,7 +83,7 @@ func (e *E2e) FirstPartitionSize(js.Value, []js.Value) interface{} {
 func (e *E2e) GetHistoricalDHPrivkey(js.Value, []js.Value) interface{} {
 	privKey, err := e.api.GetHistoricalDHPrivkey()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 	return CopyBytesToJS(privKey)
@@ -98,7 +98,7 @@ func (e *E2e) GetHistoricalDHPrivkey(js.Value, []js.Value) interface{} {
 func (e *E2e) GetHistoricalDHPubkey(js.Value, []js.Value) interface{} {
 	pubKey, err := e.api.GetHistoricalDHPubkey()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 	return CopyBytesToJS(pubKey)
@@ -116,7 +116,7 @@ func (e *E2e) GetHistoricalDHPubkey(js.Value, []js.Value) interface{} {
 func (e *E2e) HasAuthenticatedChannel(_ js.Value, args []js.Value) interface{} {
 	exists, err := e.api.HasAuthenticatedChannel(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 	return exists
@@ -132,7 +132,7 @@ func (e *E2e) HasAuthenticatedChannel(_ js.Value, args []js.Value) interface{} {
 func (e *E2e) RemoveService(_ js.Value, args []js.Value) interface{} {
 	err := e.api.RemoveService(args[0].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -160,7 +160,7 @@ func (e *E2e) SendE2E(_ js.Value, args []js.Value) interface{} {
 	sendReport, err := e.api.SendE2E(
 		args[0].Int(), recipientId, payload, e2eParams)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -205,7 +205,7 @@ func (e *E2e) AddService(_ js.Value, args []js.Value) interface{} {
 
 	err := e.api.AddService(args[0].String(), p)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -230,7 +230,7 @@ func (e *E2e) RegisterListener(_ js.Value, args []js.Value) interface{} {
 
 	err := e.api.RegisterListener(recipientId, args[1].Int(), l)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/errors.go b/wasm/errors.go
index 94057135..1e6eee76 100644
--- a/wasm/errors.go
+++ b/wasm/errors.go
@@ -51,7 +51,7 @@ func CreateUserFriendlyErrorMessage(_ js.Value, args []js.Value) interface{} {
 func UpdateCommonErrors(_ js.Value, args []js.Value) interface{} {
 	err := bindings.UpdateCommonErrors(args[0].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/fileTransfer.go b/wasm/fileTransfer.go
index 3220f6f8..a22eac3c 100644
--- a/wasm/fileTransfer.go
+++ b/wasm/fileTransfer.go
@@ -104,7 +104,7 @@ func InitFileTransfer(_ js.Value, args []js.Value) interface{} {
 	api, err := bindings.InitFileTransfer(
 		args[0].Int(), rfc, e2eFileTransferParamsJson, fileTransferParamsJson)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -133,7 +133,7 @@ func (f *FileTransfer) Send(_ js.Value, args []js.Value) interface{} {
 
 	ftID, err := f.api.Send(payload, recipientID, retry, spc, args[4].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -158,7 +158,7 @@ func (f *FileTransfer) Send(_ js.Value, args []js.Value) interface{} {
 func (f *FileTransfer) Receive(_ js.Value, args []js.Value) interface{} {
 	file, err := f.api.Receive(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -180,7 +180,7 @@ func (f *FileTransfer) Receive(_ js.Value, args []js.Value) interface{} {
 func (f *FileTransfer) CloseSend(_ js.Value, args []js.Value) interface{} {
 	err := f.api.CloseSend(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -213,7 +213,7 @@ func (f *FileTransfer) RegisterSentProgressCallback(
 
 	err := f.api.RegisterSentProgressCallback(tidBytes, spc, args[2].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -242,7 +242,7 @@ func (f *FileTransfer) RegisterReceivedProgressCallback(
 	err := f.api.RegisterReceivedProgressCallback(
 		tidBytes, rpc, args[2].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/follow.go b/wasm/follow.go
index 3f9bcc37..9264e0cd 100644
--- a/wasm/follow.go
+++ b/wasm/follow.go
@@ -55,7 +55,7 @@ import (
 func (c *Cmix) StartNetworkFollower(_ js.Value, args []js.Value) interface{} {
 	err := c.api.StartNetworkFollower(args[0].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -73,7 +73,7 @@ func (c *Cmix) StartNetworkFollower(_ js.Value, args []js.Value) interface{} {
 func (c *Cmix) StopNetworkFollower(js.Value, []js.Value) interface{} {
 	err := c.api.StopNetworkFollower()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -115,7 +115,7 @@ func (c *Cmix) NetworkFollowerStatus(js.Value, []js.Value) interface{} {
 func (c *Cmix) GetNodeRegistrationStatus(js.Value, []js.Value) interface{} {
 	b, err := c.api.GetNodeRegistrationStatus()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/group.go b/wasm/group.go
index 3dd0bf76..18873ced 100644
--- a/wasm/group.go
+++ b/wasm/group.go
@@ -61,7 +61,7 @@ func NewGroupChat(_ js.Value, args []js.Value) interface{} {
 
 	api, err := bindings.NewGroupChat(args[0].Int(), requestFunc, p)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -93,7 +93,7 @@ func (g *GroupChat) MakeGroup(_ js.Value, args []js.Value) interface{} {
 
 	report, err := g.api.MakeGroup(membershipBytes, message, name)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -114,7 +114,7 @@ func (g *GroupChat) MakeGroup(_ js.Value, args []js.Value) interface{} {
 func (g *GroupChat) ResendRequest(_ js.Value, args []js.Value) interface{} {
 	report, err := g.api.ResendRequest(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -134,7 +134,7 @@ func (g *GroupChat) ResendRequest(_ js.Value, args []js.Value) interface{} {
 func (g *GroupChat) JoinGroup(_ js.Value, args []js.Value) interface{} {
 	err := g.api.JoinGroup(args[0].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -152,7 +152,7 @@ func (g *GroupChat) JoinGroup(_ js.Value, args []js.Value) interface{} {
 func (g *GroupChat) LeaveGroup(_ js.Value, args []js.Value) interface{} {
 	err := g.api.LeaveGroup(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -178,7 +178,7 @@ func (g *GroupChat) Send(_ js.Value, args []js.Value) interface{} {
 
 	report, err := g.api.Send(groupId, message, args[2].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -194,7 +194,7 @@ func (g *GroupChat) GetGroups(js.Value, []js.Value) interface{} {
 	// () ([]byte, error)
 	groups, err := g.api.GetGroups()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -214,7 +214,7 @@ func (g *GroupChat) GetGroups(js.Value, []js.Value) interface{} {
 func (g *GroupChat) GetGroup(_ js.Value, args []js.Value) interface{} {
 	grp, err := g.api.GetGroup(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -318,7 +318,7 @@ func (g *Group) GetCreatedMS(js.Value, []js.Value) interface{} {
 func (g *Group) GetMembership(js.Value, []js.Value) interface{} {
 	membership, err := g.api.GetMembership()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/identity.go b/wasm/identity.go
index eb532493..9ea9ab10 100644
--- a/wasm/identity.go
+++ b/wasm/identity.go
@@ -36,7 +36,7 @@ func StoreReceptionIdentity(_ js.Value, args []js.Value) interface{} {
 		args[0].String(), identity, args[2].Int())
 
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -56,7 +56,7 @@ func StoreReceptionIdentity(_ js.Value, args []js.Value) interface{} {
 func LoadReceptionIdentity(_ js.Value, args []js.Value) interface{} {
 	ri, err := bindings.LoadReceptionIdentity(args[0].String(), args[1].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -72,7 +72,7 @@ func LoadReceptionIdentity(_ js.Value, args []js.Value) interface{} {
 func (c *Cmix) MakeReceptionIdentity(js.Value, []js.Value) interface{} {
 	ri, err := c.api.MakeReceptionIdentity()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -88,7 +88,7 @@ func (c *Cmix) MakeReceptionIdentity(js.Value, []js.Value) interface{} {
 func (c *Cmix) MakeLegacyReceptionIdentity(js.Value, []js.Value) interface{} {
 	ri, err := c.api.MakeLegacyReceptionIdentity()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -120,7 +120,7 @@ func (c *Cmix) GetReceptionRegistrationValidationSignature(
 func GetIDFromContact(_ js.Value, args []js.Value) interface{} {
 	cID, err := bindings.GetIDFromContact([]byte(args[0].String()))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -139,7 +139,7 @@ func GetIDFromContact(_ js.Value, args []js.Value) interface{} {
 func GetPubkeyFromContact(_ js.Value, args []js.Value) interface{} {
 	key, err := bindings.GetPubkeyFromContact([]byte(args[0].String()))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -165,7 +165,7 @@ func SetFactsOnContact(_ js.Value, args []js.Value) interface{} {
 	factListJSON := CopyBytesToGo(args[1])
 	c, err := bindings.SetFactsOnContact(marshaledContact, factListJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -183,7 +183,7 @@ func SetFactsOnContact(_ js.Value, args []js.Value) interface{} {
 func GetFactsFromContact(_ js.Value, args []js.Value) interface{} {
 	fl, err := bindings.GetFactsFromContact(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/logging.go b/wasm/logging.go
index b36aae95..14092aa7 100644
--- a/wasm/logging.go
+++ b/wasm/logging.go
@@ -37,7 +37,7 @@ import (
 func LogLevel(_ js.Value, args []js.Value) interface{} {
 	err := bindings.LogLevel(args[0].Int())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/ndf.go b/wasm/ndf.go
index 163f915f..9e055fef 100644
--- a/wasm/ndf.go
+++ b/wasm/ndf.go
@@ -28,7 +28,7 @@ func DownloadAndVerifySignedNdfWithUrl(_ js.Value, args []js.Value) interface{}
 	ndf, err := bindings.DownloadAndVerifySignedNdfWithUrl(
 		args[0].String(), args[1].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/restlike.go b/wasm/restlike.go
index 9ff8180e..2a0a23b2 100644
--- a/wasm/restlike.go
+++ b/wasm/restlike.go
@@ -34,7 +34,7 @@ func RestlikeRequest(_ js.Value, args []js.Value) interface{} {
 	msg, err := bindings.RestlikeRequest(
 		cmixId, connectionID, request, e2eParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -61,7 +61,7 @@ func RestlikeRequestAuth(_ js.Value, args []js.Value) interface{} {
 	msg, err := bindings.RestlikeRequestAuth(
 		cmixId, authConnectionID, request, e2eParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/restlikeSingle.go b/wasm/restlikeSingle.go
index 00963408..68fe3838 100644
--- a/wasm/restlikeSingle.go
+++ b/wasm/restlikeSingle.go
@@ -43,7 +43,7 @@ func RequestRestLike(_ js.Value, args []js.Value) interface{} {
 
 	msg, err := bindings.RequestRestLike(e2eID, recipient, request, paramsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -76,7 +76,7 @@ func AsyncRequestRestLike(_ js.Value, args []js.Value) interface{} {
 	err := bindings.AsyncRequestRestLike(
 		e2eID, recipient, request, paramsJSON, cb)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/single.go b/wasm/single.go
index 31bddeac..73533886 100644
--- a/wasm/single.go
+++ b/wasm/single.go
@@ -45,7 +45,7 @@ func TransmitSingleUse(_ js.Value, args []js.Value) interface{} {
 	report, err := bindings.TransmitSingleUse(
 		e2eID, recipient, tag, payload, paramsJSON, responseCB)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -70,7 +70,7 @@ func Listen(_ js.Value, args []js.Value) interface{} {
 	cb := &singleUseCallback{WrapCB(args[2], "Callback")}
 	api, err := bindings.Listen(args[0].Int(), args[1].String(), cb)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/ud.go b/wasm/ud.go
index 14aa3273..1ec3f9f4 100644
--- a/wasm/ud.go
+++ b/wasm/ud.go
@@ -107,7 +107,7 @@ func NewOrLoadUd(_ js.Value, args []js.Value) interface{} {
 	api, err := bindings.NewOrLoadUd(e2eID, follower, username,
 		registrationValidationSignature, cert, contactFile, address)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -157,7 +157,7 @@ func NewUdManagerFromBackup(_ js.Value, args []js.Value) interface{} {
 	api, err := bindings.NewUdManagerFromBackup(e2eID, follower, emailFactJson,
 		phoneFactJson, cert, contactFile, address)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -182,7 +182,7 @@ func (ud *UserDiscovery) GetFacts(js.Value, []js.Value) interface{} {
 func (ud *UserDiscovery) GetContact(js.Value, []js.Value) interface{} {
 	c, err := ud.api.GetContact()
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -202,7 +202,7 @@ func (ud *UserDiscovery) GetContact(js.Value, []js.Value) interface{} {
 func (ud *UserDiscovery) ConfirmFact(_ js.Value, args []js.Value) interface{} {
 	err := ud.api.ConfirmFact(args[0].String(), args[1].String())
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -227,7 +227,7 @@ func (ud *UserDiscovery) ConfirmFact(_ js.Value, args []js.Value) interface{} {
 func (ud *UserDiscovery) SendRegisterFact(_ js.Value, args []js.Value) interface{} {
 	confirmationID, err := ud.api.SendRegisterFact(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -246,7 +246,7 @@ func (ud *UserDiscovery) SendRegisterFact(_ js.Value, args []js.Value) interface
 func (ud *UserDiscovery) PermanentDeleteAccount(_ js.Value, args []js.Value) interface{} {
 	err := ud.api.PermanentDeleteAccount(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -264,7 +264,7 @@ func (ud *UserDiscovery) PermanentDeleteAccount(_ js.Value, args []js.Value) int
 func (ud *UserDiscovery) RemoveFact(_ js.Value, args []js.Value) interface{} {
 	err := ud.api.RemoveFact(CopyBytesToGo(args[0]))
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -310,7 +310,7 @@ func LookupUD(_ js.Value, args []js.Value) interface{} {
 	report, err := bindings.LookupUD(
 		e2eID, udContact, cb, lookupId, singleRequestParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
@@ -357,7 +357,7 @@ func SearchUD(_ js.Value, args []js.Value) interface{} {
 	report, err := bindings.SearchUD(
 		e2eID, udContact, cb, factListJSON, singleRequestParamsJSON)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return nil
 	}
 
diff --git a/wasm/utils.go b/wasm/utils.go
index 0774ec2e..73dbe40b 100644
--- a/wasm/utils.go
+++ b/wasm/utils.go
@@ -11,6 +11,7 @@ package wasm
 
 import (
 	"encoding/json"
+	"fmt"
 	jww "github.com/spf13/jwalterweatherman"
 	"syscall/js"
 )
@@ -50,7 +51,7 @@ func JsonToJS(src []byte) js.Value {
 	var inInterface map[string]interface{}
 	err := json.Unmarshal(src, &inInterface)
 	if err != nil {
-		Throw(TypeError, err.Error())
+		Throw(TypeError, err)
 		return js.ValueOf(nil)
 	}
 
@@ -60,7 +61,11 @@ func JsonToJS(src []byte) js.Value {
 // Throw function stub to throws Javascript exceptions. The exception must be
 // one of the defined Exception below. Any other error types will result in an
 // error.
-func Throw(exception Exception, message string)
+func Throw(exception Exception, err error) {
+	throw(exception, fmt.Sprintf("%+v", err))
+}
+
+func throw(exception Exception, message string)
 
 // Exception are the possible Javascript error types that can be thrown.
 type Exception string
diff --git a/wasm/wasm_js.s b/wasm/wasm_js.s
index d230d597..de7b1f13 100644
--- a/wasm/wasm_js.s
+++ b/wasm/wasm_js.s
@@ -1,6 +1,6 @@
 #include "textflag.h"
 
 // Throw enables throwing of Javascript exceptions.
-TEXT ·Throw(SB), NOSPLIT, $0
+TEXT ·throw(SB), NOSPLIT, $0
   CallImport
   RET
-- 
GitLab