diff --git a/Cargo.lock b/Cargo.lock
index fcdb077c0a5fe61b31c4397211a3ae99bf617290..80986fbd0a712ed11260cdb72bc2b70068b80d91 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,5 +1,20 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
+[[package]]
+name = "addr2line"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
 [[package]]
 name = "aes"
 version = "0.6.0"
@@ -18,7 +33,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072"
 dependencies = [
  "cipher",
- "opaque-debug",
+ "opaque-debug 0.3.0",
 ]
 
 [[package]]
@@ -28,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce"
 dependencies = [
  "cipher",
- "opaque-debug",
+ "opaque-debug 0.3.0",
 ]
 
 [[package]]
@@ -57,6 +72,15 @@ name = "arrayvec"
 version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "ascii"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e"
 
 [[package]]
 name = "assert_matches"
@@ -64,6 +88,19 @@ version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9"
 
+[[package]]
+name = "async-compression"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b72c1f1154e234325b50864a349b9c8e56939e266a4c307c0f159812df2f9537"
+dependencies = [
+ "flate2",
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+]
+
 [[package]]
 name = "async-oneshot"
 version = "0.4.2"
@@ -90,12 +127,42 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
 
+[[package]]
+name = "backtrace"
+version = "0.3.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc"
+dependencies = [
+ "addr2line",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
 [[package]]
 name = "base64"
 version = "0.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
 
+[[package]]
+name = "beef"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6736e2428df2ca2848d846c43e88745121a6654696e349ce0054a420815a7409"
+
+[[package]]
+name = "bincode"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d"
+dependencies = [
+ "byteorder",
+ "serde",
+]
+
 [[package]]
 name = "bitflags"
 version = "1.2.1"
@@ -114,7 +181,28 @@ dependencies = [
  "cfg-if 0.1.10",
  "constant_time_eq",
  "crypto-mac",
- "digest",
+ "digest 0.9.0",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b"
+dependencies = [
+ "block-padding",
+ "byte-tools",
+ "byteorder",
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5"
+dependencies = [
+ "byte-tools",
 ]
 
 [[package]]
@@ -129,12 +217,24 @@ version = "3.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe"
 
+[[package]]
+name = "byte-tools"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7"
+
 [[package]]
 name = "byteorder"
 version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"
 
+[[package]]
+name = "bytes"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
+
 [[package]]
 name = "cbindgen"
 version = "0.14.3"
@@ -186,7 +286,7 @@ version = "0.2.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.4",
 ]
 
 [[package]]
@@ -224,19 +324,41 @@ dependencies = [
  "vec_map",
 ]
 
+[[package]]
+name = "combine"
+version = "3.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680"
+dependencies = [
+ "ascii",
+ "byteorder",
+ "either",
+ "memchr",
+ "unreachable",
+]
+
 [[package]]
 name = "constant_time_eq"
 version = "0.1.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
 
+[[package]]
+name = "crc32fast"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
 [[package]]
 name = "crypto-mac"
 version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.4",
  "subtle",
 ]
 
@@ -257,13 +379,112 @@ dependencies = [
  "thiserror",
 ]
 
+[[package]]
+name = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+dependencies = [
+ "generic-array 0.12.4",
+]
+
 [[package]]
 name = "digest"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
 dependencies = [
- "generic-array",
+ "generic-array 0.14.4",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "dubp"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1669c61ccfe0d3fc7be8fe3175ebd401b9c879f638425f31e92777c73b32ea86"
+dependencies = [
+ "dubp-common",
+ "dubp-documents",
+ "dubp-documents-parser",
+ "dubp-wallet",
+ "dup-crypto 0.50.0",
+]
+
+[[package]]
+name = "dubp-client"
+version = "0.1.0"
+source = "git+https://git.duniter.org/libs/dubp-rs-client-lib?branch=master#a690f9b1bb029495c6aaf957c31d528dd282b49c"
+dependencies = [
+ "bincode",
+ "dubp",
+ "duniter-bca-types",
+ "graphql_client",
+ "maybe-async",
+ "reqwest",
+ "serde",
+ "static_assertions",
+ "thiserror",
+]
+
+[[package]]
+name = "dubp-common"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "515fb09166a50b4543a99c42359fc4afa5a4c7af118c6f9627575c2760f3fef8"
+dependencies = [
+ "dup-crypto 0.50.0",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "zerocopy",
+]
+
+[[package]]
+name = "dubp-documents"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccc9327c62778ee4fd060c0efbe32c6cfda5e317c4a2eb4ddee8293fbd278904"
+dependencies = [
+ "beef",
+ "dubp-wallet",
+ "log",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "dubp-documents-parser"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "271ce4a6bebfdfdaefb0e51f57c9bb04976fce5fbe2744dd60c1dcf857c60c20"
+dependencies = [
+ "dubp-documents",
+ "json-pest-parser",
+ "pest",
+ "pest_derive",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "dubp-wallet"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6e65a121fa6745038e903ed3d1eb6a97f9658c6c6e2bfbf7e9ffdaf34161d23"
+dependencies = [
+ "byteorder",
+ "dubp-common",
+ "serde",
+ "smallvec",
+ "thiserror",
+ "zerocopy",
 ]
 
 [[package]]
@@ -274,7 +495,8 @@ dependencies = [
  "assert_matches",
  "cbindgen",
  "dart-bindgen",
- "dup-crypto",
+ "dubp-client",
+ "dup-crypto 0.46.0",
  "fast-threadpool",
  "once_cell",
  "parking_lot",
@@ -282,6 +504,19 @@ dependencies = [
  "thiserror",
 ]
 
+[[package]]
+name = "duniter-bca-types"
+version = "0.1.0"
+source = "git+https://git.duniter.org/nodes/typescript/duniter?branch=dev#591f334185151a200a7dbb06b32ff434a19b0885"
+dependencies = [
+ "arrayvec",
+ "bincode",
+ "dubp",
+ "serde",
+ "smallvec",
+ "thiserror",
+]
+
 [[package]]
 name = "dup-crypto"
 version = "0.46.0"
@@ -305,6 +540,29 @@ dependencies = [
  "zeroize",
 ]
 
+[[package]]
+name = "dup-crypto"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3032421000ca2cdd372bd72f4c548be7f1386d357abb0936291890064d3072e8"
+dependencies = [
+ "aes",
+ "arrayvec",
+ "base64",
+ "blake3",
+ "bs58",
+ "byteorder",
+ "cryptoxide",
+ "ed25519-bip32",
+ "getrandom",
+ "once_cell",
+ "ring",
+ "serde",
+ "thiserror",
+ "zerocopy",
+ "zeroize",
+]
+
 [[package]]
 name = "ed25519-bip32"
 version = "0.3.2"
@@ -314,6 +572,21 @@ dependencies = [
  "cryptoxide",
 ]
 
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
 [[package]]
 name = "envmnt"
 version = "0.8.4"
@@ -324,6 +597,34 @@ dependencies = [
  "indexmap",
 ]
 
+[[package]]
+name = "failure"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
+dependencies = [
+ "backtrace",
+ "failure_derive",
+]
+
+[[package]]
+name = "failure_derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
+name = "fake-simd"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
+
 [[package]]
 name = "fast-threadpool"
 version = "0.3.0"
@@ -335,6 +636,18 @@ dependencies = [
  "num_cpus",
 ]
 
+[[package]]
+name = "flate2"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crc32fast",
+ "libc",
+ "miniz_oxide",
+]
+
 [[package]]
 name = "flume"
 version = "0.10.1"
@@ -344,18 +657,106 @@ dependencies = [
  "spinning_top",
 ]
 
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
+dependencies = [
+ "matches",
+ "percent-encoding",
+]
+
 [[package]]
 name = "fsio"
 version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c1fd087255f739f4f1aeea69f11b72f8080e9c2e7645cd06955dad4a178a49e3"
 
+[[package]]
+name = "futures-channel"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94"
+
+[[package]]
+name = "futures-io"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
 [[package]]
 name = "futures-micro"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "61e9325be55c5581082cd110294fa988c1f920bc573ec370ef201e33c469a95a"
 
+[[package]]
+name = "futures-sink"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3"
+
+[[package]]
+name = "futures-task"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80"
+
+[[package]]
+name = "futures-util"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
 [[package]]
 name = "generic-array"
 version = "0.14.4"
@@ -386,12 +787,98 @@ dependencies = [
  "wasi",
 ]
 
+[[package]]
+name = "gimli"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce"
+
 [[package]]
 name = "glob"
 version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
 
+[[package]]
+name = "graphql-introspection-query"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "610aac641dbd2a457ad4cef34aa2827dae3f035fd214cb38c2d62d8543f3973f"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "graphql-parser"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5613c31f18676f164112732202124f373bb2103ff017b3b85ca954ea6a66ada"
+dependencies = [
+ "combine",
+ "failure",
+]
+
+[[package]]
+name = "graphql_client"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0bb4f09181e4f80018d01c612125b07e0156f3753bfac37055fe2a25e031ca8"
+dependencies = [
+ "doc-comment",
+ "graphql_query_derive",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "graphql_client_codegen"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e304c223c809b3bff4614018f8e6d9edb176b31d64ed9ea48b6ae8b1a03abb9"
+dependencies = [
+ "failure",
+ "graphql-introspection-query",
+ "graphql-parser",
+ "heck",
+ "lazy_static",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_json",
+ "syn",
+]
+
+[[package]]
+name = "graphql_query_derive"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1f6b14d5ce549227aa9e649cd9d36d008b91021275a8e0a67d71cef815adc2f"
+dependencies = [
+ "failure",
+ "graphql_client_codegen",
+ "proc-macro2",
+ "syn",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc018e188373e2777d0ef2467ebff62a08e66c3f5857b23c8fbec3018210dc00"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
 [[package]]
 name = "hashbrown"
 version = "0.9.1"
@@ -416,6 +903,90 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "http"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691"
+
+[[package]]
+name = "httpdate"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
+
+[[package]]
+name = "hyper"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8e946c2b1349055e0b72ae281b238baf1a3ea7307c7e9f9d64673bdd9c26ac7"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.22.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64"
+dependencies = [
+ "futures-util",
+ "hyper",
+ "log",
+ "rustls",
+ "tokio",
+ "tokio-rustls",
+ "webpki",
+]
+
+[[package]]
+name = "idna"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
 [[package]]
 name = "indexmap"
 version = "1.6.2"
@@ -435,6 +1006,12 @@ dependencies = [
  "cfg-if 1.0.0",
 ]
 
+[[package]]
+name = "ipnet"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135"
+
 [[package]]
 name = "itoa"
 version = "0.4.7"
@@ -450,6 +1027,18 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "json-pest-parser"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bc5c84a2bceeda1ce3bd58497bde2d8cba61ca0b45873ef502401f0ff2ae8ed"
+dependencies = [
+ "pest",
+ "pest_derive",
+ "thiserror",
+ "unwrap",
+]
+
 [[package]]
 name = "lazy_static"
 version = "1.4.0"
@@ -475,9 +1064,76 @@ dependencies = [
 name = "log"
 version = "0.4.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+
+[[package]]
+name = "maybe-async"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bb8e1fec4e9a343755fdcd6adc9394c0ac0bb764eb36b3aecfdf151a44e8c83"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "memchr"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
+[[package]]
+name = "mio"
+version = "0.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e50ae3f04d169fcc9bde0b547d1c205219b7157e07ded9c5aff03e0637cb3ed7"
+dependencies = [
+ "libc",
+ "log",
+ "miow",
+ "ntapi",
+ "winapi",
+]
+
+[[package]]
+name = "miow"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
 dependencies = [
- "cfg-if 0.1.10",
+ "winapi",
 ]
 
 [[package]]
@@ -486,6 +1142,15 @@ version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ab250442c86f1850815b5d268639dff018c0627022bc1940eb2d642ca1ce12f0"
 
+[[package]]
+name = "ntapi"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "num_cpus"
 version = "1.13.0"
@@ -496,12 +1161,24 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "object"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4"
+
 [[package]]
 name = "once_cell"
 version = "1.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
 
+[[package]]
+name = "opaque-debug"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c"
+
 [[package]]
 name = "opaque-debug"
 version = "0.3.0"
@@ -533,12 +1210,105 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pest"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53"
+dependencies = [
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d"
+dependencies = [
+ "maplit",
+ "pest",
+ "sha-1",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
 [[package]]
 name = "ppv-lite86"
 version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
 
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
+
 [[package]]
 name = "proc-macro2"
 version = "1.0.24"
@@ -615,6 +1385,44 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "reqwest"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4"
+dependencies = [
+ "async-compression",
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "ipnet",
+ "js-sys",
+ "lazy_static",
+ "log",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-rustls",
+ "tokio-util",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "webpki-roots",
+ "winreg",
+]
+
 [[package]]
 name = "ring"
 version = "0.16.20"
@@ -630,6 +1438,25 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "rustc-demangle"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232"
+
+[[package]]
+name = "rustls"
+version = "0.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b"
+dependencies = [
+ "base64",
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
 [[package]]
 name = "rusty-hook"
 version = "0.11.2"
@@ -654,6 +1481,16 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
+[[package]]
+name = "sct"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
 [[package]]
 name = "serde"
 version = "1.0.123"
@@ -685,11 +1522,55 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha-1"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df"
+dependencies = [
+ "block-buffer",
+ "digest 0.8.1",
+ "fake-simd",
+ "opaque-debug 0.2.3",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
 [[package]]
 name = "smallvec"
 version = "1.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "socket2"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "winapi",
+]
 
 [[package]]
 name = "spin"
@@ -706,6 +1587,12 @@ dependencies = [
  "lock_api",
 ]
 
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
 [[package]]
 name = "strsim"
 version = "0.8.0"
@@ -784,6 +1671,61 @@ dependencies = [
  "syn",
 ]
 
+[[package]]
+name = "tinyvec"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tokio"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "memchr",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6"
+dependencies = [
+ "rustls",
+ "tokio",
+ "webpki",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "log",
+ "pin-project-lite",
+ "tokio",
+]
+
 [[package]]
 name = "toml"
 version = "0.5.8"
@@ -793,12 +1735,68 @@ dependencies = [
  "serde",
 ]
 
+[[package]]
+name = "tower-service"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
+
+[[package]]
+name = "tracing"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f"
+dependencies = [
+ "cfg-if 1.0.0",
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
 [[package]]
 name = "typenum"
 version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
 
+[[package]]
+name = "ucd-trie"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+dependencies = [
+ "matches",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"
+dependencies = [
+ "tinyvec",
+]
+
 [[package]]
 name = "unicode-segmentation"
 version = "1.7.1"
@@ -817,12 +1815,39 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
 
+[[package]]
+name = "unreachable"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
+dependencies = [
+ "void",
+]
+
 [[package]]
 name = "untrusted"
 version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
 
+[[package]]
+name = "unwrap"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e33648dd74328e622c7be51f3b40a303c63f93e6fa5f08778b6203a4c25c20f"
+
+[[package]]
+name = "url"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "matches",
+ "percent-encoding",
+]
+
 [[package]]
 name = "vec_map"
 version = "0.8.2"
@@ -835,6 +1860,22 @@ version = "0.9.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
 
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
 [[package]]
 name = "wasi"
 version = "0.10.2+wasi-snapshot-preview1"
@@ -848,6 +1889,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be"
 dependencies = [
  "cfg-if 1.0.0",
+ "serde",
+ "serde_json",
  "wasm-bindgen-macro",
 ]
 
@@ -866,6 +1909,18 @@ dependencies = [
  "wasm-bindgen-shared",
 ]
 
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
 [[package]]
 name = "wasm-bindgen-macro"
 version = "0.2.70"
@@ -905,6 +1960,25 @@ dependencies = [
  "wasm-bindgen",
 ]
 
+[[package]]
+name = "webpki"
+version = "0.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82015b7e0b8bad8185994674a13a93306bea76cf5a16c5a181382fd3a5ec2376"
+dependencies = [
+ "webpki",
+]
+
 [[package]]
 name = "winapi"
 version = "0.3.9"
@@ -927,6 +2001,15 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "winreg"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "zerocopy"
 version = "0.3.0"
diff --git a/native/dubp_rs/Cargo.toml b/native/dubp_rs/Cargo.toml
index 180f0c5460bc89d421bd318ec95d23e220769c7d..0208e51b34362f37531837f04968e91ee11fba3a 100644
--- a/native/dubp_rs/Cargo.toml
+++ b/native/dubp_rs/Cargo.toml
@@ -11,6 +11,8 @@ crate-type = ["rlib"]
 
 [dependencies]
 allo-isolate = "0.1.6"
+dubp-client = { git = "https://git.duniter.org/libs/dubp-rs-client-lib", branch = "master", features = ["blocking"], default-features = false }
+#dubp-client= { path = "../dubp-rs-client-lib", features = ["blocking"], default-features = false }
 dup-crypto = { version = "0.46.0", features = ["bip32-ed25519", "dewif", "mnemonic", "mnemonic_french", "scrypt"] }
 fast-threadpool = { version = "0.3.0", default-features = false }
 once_cell = { version = "1.3.1", default-features = false, features = ["std"] }
diff --git a/native/dubp_rs/src/dewif.rs b/native/dubp_rs/src/dewif.rs
index 63252a323beff80df0047e0fd4349cae2bde7aff..4d4a53002d091132e753b8469cf11cc892cd32d1 100644
--- a/native/dubp_rs/src/dewif.rs
+++ b/native/dubp_rs/src/dewif.rs
@@ -28,9 +28,12 @@ pub(super) fn change_secret_code(
     let new_log_n = log_n(system_memory);
     let new_secret_code = gen_secret_code(member_wallet, secret_code_type, new_log_n)?;
 
-    let new_dewif =
-        dup_crypto::dewif::change_dewif_passphrase(dewif, old_secret_code, &new_secret_code)
-            .map_err(DubpError::DewifReadError)?;
+    let new_dewif = dubp_client::crypto::dewif::change_dewif_passphrase(
+        dewif,
+        old_secret_code,
+        &new_secret_code,
+    )
+    .map_err(DubpError::DewifReadError)?;
 
     Ok(vec![new_dewif, new_secret_code])
 }
@@ -46,15 +49,20 @@ pub(super) fn gen_dewif(
     let currency = parse_currency(currency)?;
     let mnemonic =
         Mnemonic::from_phrase(mnemonic, language).map_err(|_| DubpError::WrongLanguage)?;
-    let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic);
+    let seed = dubp_client::crypto::mnemonic::mnemonic_to_seed(&mnemonic);
 
     let log_n = log_n(system_memory);
     let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
 
-    let keypair = dup_crypto::keys::ed25519::bip32::KeyPair::from_seed(seed.clone());
+    let keypair = dubp_client::crypto::keys::ed25519::bip32::KeyPair::from_seed(seed.clone());
     let pubkey = keypair.public_key();
-    let dewif =
-        dup_crypto::dewif::write_dewif_v4_content(currency, log_n, &secret_code, &pubkey, seed);
+    let dewif = dubp_client::crypto::dewif::write_dewif_v4_content(
+        currency,
+        log_n,
+        &secret_code,
+        &pubkey,
+        seed,
+    );
 
     Ok(vec![dewif, secret_code])
 }
@@ -64,11 +72,11 @@ pub(super) fn get_dewif_meta(
     member_wallet: bool,
     secret_code_type: SecretCodeType,
 ) -> Result<Vec<String>, DubpError> {
-    let dup_crypto::dewif::DewifMeta {
+    let dubp_client::crypto::dewif::DewifMeta {
         currency,
         log_n,
         version,
-    } = dup_crypto::dewif::read_dewif_meta(dewif).map_err(DubpError::DewifReadError)?;
+    } = dubp_client::crypto::dewif::read_dewif_meta(dewif).map_err(DubpError::DewifReadError)?;
 
     let secret_code_len =
         crate::secret_code::compute_secret_code_len(member_wallet, secret_code_type, log_n)?;
@@ -98,7 +106,7 @@ pub(super) fn get_pubkey(
             secret_code,
         )
     } else if address_index_opt.is_none() && external_opt.is_none() {
-        let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+        let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
             ExpectedCurrency::Specific(currency),
             dewif,
             &secret_code.to_ascii_uppercase(),
@@ -125,7 +133,7 @@ pub(super) fn get_secret_code_len(
     let member_wallet = member_wallet != 0;
     let secret_code_type = SecretCodeType::from(secret_code_type);
 
-    let log_n = dup_crypto::dewif::read_dewif_log_n(ExpectedCurrency::Any, dewif)
+    let log_n = dubp_client::crypto::dewif::read_dewif_log_n(ExpectedCurrency::Any, dewif)
         .map_err(DubpError::DewifReadError)?;
 
     Ok(crate::secret_code::compute_secret_code_len(
diff --git a/native/dubp_rs/src/dewif/bip32.rs b/native/dubp_rs/src/dewif/bip32.rs
index e5392852a52205ba54b2636380966039fe2ffa17..2f692ec9e605eacc2670ac250ba7a8a819bbe685 100644
--- a/native/dubp_rs/src/dewif/bip32.rs
+++ b/native/dubp_rs/src/dewif/bip32.rs
@@ -34,7 +34,7 @@ pub(crate) fn get_accounts_pubkeys(
     if accounts_indexs.contains(&U31::new(0)?) {
         verify_member_secret_code(currency, dewif, secret_code)?;
     }
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
@@ -53,6 +53,36 @@ pub(crate) fn get_accounts_pubkeys(
     }
 }
 
+pub(crate) fn get_bip32_keypair(
+    account_index: u32,
+    address_index_opt: Option<U31>,
+    currency: Currency,
+    dewif: &str,
+    external_opt: Option<bool>,
+    secret_code: &str,
+) -> Result<KeyPairEnum, DubpError> {
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
+        ExpectedCurrency::Specific(currency),
+        dewif,
+        &secret_code.to_ascii_uppercase(),
+    )
+    .map_err(DubpError::DewifReadError)?;
+
+    if account_index == 0 {
+        verify_member_secret_code(currency, dewif, secret_code)?;
+    }
+
+    match keypairs.next() {
+        Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => {
+            Ok(KeyPairEnum::Bip32Ed25519(master_keypair.derive(
+                z_get_derivation_path(account_index, address_index_opt, external_opt)?,
+            )))
+        }
+        Some(_) => Err(DubpError::NotHdWallet),
+        None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
+    }
+}
+
 pub(crate) fn get_bip32_pubkey(
     account_index: u32,
     address_index_opt: Option<U31>,
@@ -61,7 +91,7 @@ pub(crate) fn get_bip32_pubkey(
     external_opt: Option<bool>,
     secret_code: &str,
 ) -> Result<String, DubpError> {
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
@@ -73,12 +103,14 @@ pub(crate) fn get_bip32_pubkey(
     }
 
     match keypairs.next() {
-        Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => get_bip32_pubkey_inner(
-            account_index,
-            address_index_opt,
-            external_opt,
-            master_keypair,
-        ),
+        Some(KeyPairEnum::Bip32Ed25519(master_keypair)) => Ok(master_keypair
+            .derive(z_get_derivation_path(
+                account_index,
+                address_index_opt,
+                external_opt,
+            )?)
+            .public_key()
+            .to_base58()),
         Some(_) => Err(DubpError::NotHdWallet),
         None => Err(DubpError::DewifReadError(DewifReadError::CorruptedContent)),
     }
@@ -111,7 +143,7 @@ pub(crate) fn load_opaque_bip32_accounts(
     dewif: &str,
     secret_code: &str,
 ) -> Result<(), DubpError> {
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
@@ -147,7 +179,7 @@ pub(crate) fn sign_bip32(
     secret_code: &str,
     msg: &str,
 ) -> Result<String, DubpError> {
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
@@ -180,7 +212,7 @@ pub(crate) fn sign_several_bip32(
     secret_code: &str,
     msgs: &[&str],
 ) -> Result<Vec<String>, DubpError> {
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
@@ -204,22 +236,6 @@ pub(crate) fn sign_several_bip32(
     }
 }
 
-fn get_bip32_pubkey_inner(
-    account_index: u32,
-    address_index_opt: Option<U31>,
-    external_opt: Option<bool>,
-    master_keypair: KeyPair,
-) -> Result<String, DubpError> {
-    Ok(master_keypair
-        .derive(z_get_derivation_path(
-            account_index,
-            address_index_opt,
-            external_opt,
-        )?)
-        .public_key()
-        .to_base58())
-}
-
 fn sign_bip32_inner(
     account_index: u32,
     address_index_opt: Option<U31>,
@@ -265,9 +281,11 @@ fn verify_member_secret_code(
     secret_code: &str,
 ) -> Result<(), DubpError> {
     if crate::secret_code::is_ascii_letters(secret_code) {
-        let log_n =
-            dup_crypto::dewif::read_dewif_log_n(ExpectedCurrency::Specific(currency), dewif)
-                .map_err(DubpError::DewifReadError)?;
+        let log_n = dubp_client::crypto::dewif::read_dewif_log_n(
+            ExpectedCurrency::Specific(currency),
+            dewif,
+        )
+        .map_err(DubpError::DewifReadError)?;
         let expected_secret_code_len =
             crate::secret_code::compute_secret_code_len(true, SecretCodeType::Letters, log_n)?;
 
diff --git a/native/dubp_rs/src/dewif/classic.rs b/native/dubp_rs/src/dewif/classic.rs
index a0e23f8d6eb8dd920250b99ed4b3c230875d128f..e6fe1c3f162b41e005d997159caf61a521e1ea55 100644
--- a/native/dubp_rs/src/dewif/classic.rs
+++ b/native/dubp_rs/src/dewif/classic.rs
@@ -21,7 +21,7 @@ pub(crate) fn sign(
     secret_code: &str,
     msg: &str,
 ) -> Result<String, DubpError> {
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
@@ -40,7 +40,7 @@ pub(crate) fn sign_several(
     secret_code: &str,
     msgs: &[&str],
 ) -> Result<Vec<String>, DubpError> {
-    let mut keypairs = dup_crypto::dewif::read_dewif_file_content(
+    let mut keypairs = dubp_client::crypto::dewif::read_dewif_file_content(
         ExpectedCurrency::Specific(currency),
         dewif,
         &secret_code.to_ascii_uppercase(),
diff --git a/native/dubp_rs/src/error.rs b/native/dubp_rs/src/error.rs
index 0448156b88475f5f5425d62d3dff5e38c71de190..e68957d5a767674f7579c1b1bdfad7789c40c8d9 100644
--- a/native/dubp_rs/src/error.rs
+++ b/native/dubp_rs/src/error.rs
@@ -16,6 +16,7 @@
 use crate::*;
 
 /// Dubp error
+#[allow(clippy::large_enum_variant)]
 #[derive(Debug, Error)]
 pub(crate) enum DubpError {
     #[error("{0}")]
@@ -26,6 +27,8 @@ pub(crate) enum DubpError {
     GetMasterPubkeyOfHdWallet,
     #[error("Give external bool or address index for legacy wallet.")]
     GiveExternalBoolOrAddressIndexForLegacyWallet,
+    #[error("{0}")]
+    GvaClientError(dubp_client::GvaClientError),
     #[error("I/O error: {0}")]
     IoErr(io::Error),
     #[error("{0}")]
@@ -33,6 +36,8 @@ pub(crate) enum DubpError {
     #[error("{0}")]
     InvalidPubkey(PublicKeyFromStrErr),
     #[error("{0}")]
+    InvalidScript(dubp_client::documents_parser::TextParseError),
+    #[error("{0}")]
     InvalidU31(U31Error),
     #[error("Invalid secret code type")]
     InvalidSecretCodeType,
@@ -44,6 +49,8 @@ pub(crate) enum DubpError {
     NullParamErr,
     #[error("Opaque account not loaded")]
     OpaqueAccountNotLoaded,
+    #[error("Payment error: {0}")]
+    PaymentError(String),
     #[error("Secret code too short: please change your secret code")]
     SecretCodeTooShort,
     #[error("The chaining address cannot be used to sign with opaque account")]
diff --git a/native/dubp_rs/src/inputs.rs b/native/dubp_rs/src/inputs.rs
index 4aeaee9fb4b6a0fbf35aecae52d7b506aa38e4a2..bd6fcc983e0378d0ca4fe4e2bfc17c832b6dfece 100644
--- a/native/dubp_rs/src/inputs.rs
+++ b/native/dubp_rs/src/inputs.rs
@@ -52,6 +52,20 @@ pub(crate) fn char_ptr_to_str<'a>(c_char_ptr: *const raw::c_char) -> Result<&'a
     }
 }
 
+pub(crate) fn char_ptr_to_opt_string(
+    c_char_ptr: *const raw::c_char,
+) -> Result<Option<String>, DubpError> {
+    Ok(if c_char_ptr.is_null() {
+        None
+    } else {
+        Some(
+            unsafe { CStr::from_ptr(c_char_ptr).to_str() }
+                .map_err(DubpError::Utf8Error)?
+                .to_owned(),
+        )
+    })
+}
+
 pub(crate) fn char_ptr_prt_to_vec_u31(
     u32_ptr: *const u32,
     len: u32,
diff --git a/native/dubp_rs/src/legacy.rs b/native/dubp_rs/src/legacy.rs
index 92bb737fc1a7cd9cbbbceed3d8667d66c9eb72b4..d1831ec575b8a66b663146c8129b9e22a07d423b 100644
--- a/native/dubp_rs/src/legacy.rs
+++ b/native/dubp_rs/src/legacy.rs
@@ -14,7 +14,7 @@
 // along with this program.  If not, see <https://www.gnu.org/licenses/>.
 
 use crate::*;
-use dup_crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword};
+use dubp_client::crypto::keys::ed25519::{KeyPairFromSaltedPasswordGenerator, SaltedPassword};
 
 pub(super) fn gen_dewif_from_legacy(
     currency: &str,
@@ -30,7 +30,8 @@ pub(super) fn gen_dewif_from_legacy(
 
     let log_n = crate::dewif::log_n(system_memory);
     let secret_code = gen_secret_code(member_wallet, secret_code_type, log_n)?;
-    let dewif = dup_crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code);
+    let dewif =
+        dubp_client::crypto::dewif::write_dewif_v3_content(currency, &keypair, log_n, &secret_code);
     let pubkey = keypair.public_key().to_base58();
     Ok(vec![dewif, secret_code, pubkey])
 }
diff --git a/native/dubp_rs/src/lib.rs b/native/dubp_rs/src/lib.rs
index 37cd38e97acb62090a0b7654b1949a0bed2f4866..f6ba7456c6b7e78c10acb6cde67c814a046e8a27 100644
--- a/native/dubp_rs/src/lib.rs
+++ b/native/dubp_rs/src/lib.rs
@@ -21,6 +21,7 @@ mod error;
 mod inputs;
 mod legacy;
 mod mnemonic;
+mod payment;
 mod pubkey;
 mod secret_code;
 
@@ -29,7 +30,7 @@ use crate::inputs::*;
 use crate::r#async::exec_async;
 use crate::secret_code::gen_secret_code;
 use allo_isolate::{IntoDart, Isolate};
-use dup_crypto::{
+use dubp_client::crypto::{
     bases::b58::ToBase58,
     dewif::{Currency, DewifReadError, ExpectedCurrency, G1_CURRENCY, G1_TEST_CURRENCY},
     keys::{
@@ -459,3 +460,59 @@ pub extern "C" fn sign_several(
         },
     )
 }
+
+#[no_mangle]
+pub extern "C" fn simple_payment_bip32(
+    port: i64,
+    account_index: u32,
+    amount: f64,
+    currency: *const raw::c_char,
+    dewif: *const raw::c_char,
+    gva_endpoint: *const raw::c_char,
+    recipient: *const raw::c_char,
+    secret_code: *const raw::c_char,
+    tx_comment: *const raw::c_char,
+) {
+    exec_async(
+        port,
+        || {
+            let currency = parse_currency(char_ptr_to_str(currency)?)?;
+            let dewif = char_ptr_to_str(dewif)?;
+            let gva_endpoint = char_ptr_to_str(gva_endpoint)?;
+            let recipient = char_ptr_to_str(recipient)?;
+            let secret_code = char_ptr_to_str(secret_code)?;
+            let tx_comment = char_ptr_to_opt_string(tx_comment)?;
+            Ok((
+                account_index,
+                amount,
+                currency,
+                dewif,
+                gva_endpoint,
+                secret_code,
+                recipient,
+                tx_comment,
+            ))
+        },
+        |(
+            account_index,
+            amount,
+            currency,
+            dewif,
+            gva_endpoint,
+            secret_code,
+            recipient,
+            tx_comment,
+        )| {
+            payment::simple_payment(
+                account_index,
+                amount,
+                currency,
+                dewif,
+                gva_endpoint,
+                secret_code,
+                recipient,
+                tx_comment,
+            )
+        },
+    )
+}
diff --git a/native/dubp_rs/src/mnemonic.rs b/native/dubp_rs/src/mnemonic.rs
index b9148e0f6a1dfdd8b63f874437cd92cefd833471..0b9849aa2f428fea2dd6e5de76c68eba63236ae8 100644
--- a/native/dubp_rs/src/mnemonic.rs
+++ b/native/dubp_rs/src/mnemonic.rs
@@ -24,7 +24,7 @@ pub(super) fn gen_mnemonic(language: Language) -> Result<String, DubpError> {
 pub(super) fn mnemonic_to_pubkey(language: Language, mnemonic: &str) -> Result<String, DubpError> {
     let mnemonic =
         Mnemonic::from_phrase(mnemonic, language).map_err(|_| DubpError::WrongLanguage)?;
-    let seed = dup_crypto::mnemonic::mnemonic_to_seed(&mnemonic);
+    let seed = dubp_client::crypto::mnemonic::mnemonic_to_seed(&mnemonic);
     let keypair = KeyPairFromSeed32Generator::generate(seed);
     Ok(keypair.public_key().to_base58())
 }
diff --git a/native/dubp_rs/src/payment.rs b/native/dubp_rs/src/payment.rs
new file mode 100644
index 0000000000000000000000000000000000000000..b4c4a5f7d21a4e56a6aa5e8506aee4ab3b23b93a
--- /dev/null
+++ b/native/dubp_rs/src/payment.rs
@@ -0,0 +1,66 @@
+//  Copyright (C) 2020  Éloïs SANCHEZ.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program 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 Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+use crate::*;
+use dubp_client::wallet::prelude::*;
+use dubp_client::{GvaClient, NaiveGvaClient};
+
+#[allow(clippy::too_many_arguments)]
+pub(super) fn simple_payment(
+    account_index: u32,
+    amount: f64,
+    currency: Currency,
+    dewif: &str,
+    gva_endpoint: &str,
+    secret_code: &str,
+    recipient: &str,
+    tx_comment: Option<String>,
+) -> Result<(), DubpError> {
+    let keypair = crate::dewif::bip32::get_bip32_keypair(
+        account_index,
+        None,
+        currency,
+        dewif,
+        None,
+        secret_code,
+    )?;
+
+    let gva_client = NaiveGvaClient::new(gva_endpoint).expect("invalid' endpoint");
+
+    let amount = dubp_client::Amount::Uds(amount);
+
+    let recipient = if let Ok(pubkey) = PublicKey::from_base58(recipient) {
+        WalletScriptV10::single_sig(pubkey)
+    } else {
+        dubp_client::documents_parser::wallet_script_from_str(recipient)
+            .map_err(DubpError::InvalidScript)?
+    };
+
+    let res = match keypair.generate_signator() {
+        dubp_client::crypto::keys::SignatorEnum::Ed25519(signator) => gva_client
+            .simple_payment(amount, &signator, recipient, tx_comment, None)
+            .map_err(DubpError::GvaClientError)?,
+        dubp_client::crypto::keys::SignatorEnum::Schnorr() => unreachable!(),
+        dubp_client::crypto::keys::SignatorEnum::Bip32Ed25519(signator) => gva_client
+            .simple_payment(amount, &signator, recipient, tx_comment, None)
+            .map_err(DubpError::GvaClientError)?,
+    };
+
+    if let dubp_client::PaymentResult::Errors(errors) = res {
+        Err(DubpError::PaymentError(format!("{:?}", errors)))
+    } else {
+        Ok(())
+    }
+}
diff --git a/native/dubp_rs/src/secret_code.rs b/native/dubp_rs/src/secret_code.rs
index ae42d23366d62b148e361cd9c7289f3b58210178..ab6efc19f2fda5c14f6ba5959922b5346d5fdae2 100644
--- a/native/dubp_rs/src/secret_code.rs
+++ b/native/dubp_rs/src/secret_code.rs
@@ -67,7 +67,7 @@ pub(crate) fn is_ascii_letters(secret_code: &str) -> bool {
 }
 
 fn gen_random_digits(n: usize) -> Result<String, DubpError> {
-    let mut digits_string = dup_crypto::rand::gen_u32()
+    let mut digits_string = dubp_client::crypto::rand::gen_u32()
         .map_err(|_| DubpError::RandErr)?
         .to_string();
     digits_string.truncate(n);
@@ -97,7 +97,7 @@ fn gen_random_letters(mut n: usize) -> Result<String, DubpError> {
 }
 
 fn gen_random_letters_inner(n: usize) -> Result<String, DubpError> {
-    let mut i = dup_crypto::rand::gen_u32().map_err(|_| DubpError::RandErr)?;
+    let mut i = dubp_client::crypto::rand::gen_u32().map_err(|_| DubpError::RandErr)?;
     let mut letters = String::new();
 
     for _ in 0..n {
diff --git a/packages/dubp_rs/lib/dubp.dart b/packages/dubp_rs/lib/dubp.dart
index 70003480b7eacbff317c1a9f7ed325430aa724e6..dbceb8260c78c9729a7a1d953b4f6a0623b9fbf8 100644
--- a/packages/dubp_rs/lib/dubp.dart
+++ b/packages/dubp_rs/lib/dubp.dart
@@ -399,6 +399,35 @@ class DubpRust {
     return completer.future;
   }
 
+  ///  Make a simple payment from a transparent account
+  static Future<void> simplePaymentFromTransparentAccount(
+      {int accountIndex,
+      double amount,
+      String currency = "g1",
+      String dewif,
+      String gvaEndpoint,
+      String recipient,
+      String secretCode,
+      String txComment}) {
+    final completer = Completer<void>();
+    final sendPort =
+        singleCompletePort<void, String>(completer, callback: _handleErrVoid);
+
+    native.simple_payment_bip32(
+      sendPort.nativePort,
+      accountIndex,
+      amount,
+      StringUtf8Pointer(currency).toNativeUtf8(),
+      StringUtf8Pointer(dewif).toNativeUtf8(),
+      StringUtf8Pointer(gvaEndpoint).toNativeUtf8(),
+      StringUtf8Pointer(recipient).toNativeUtf8(),
+      StringUtf8Pointer(secretCode).toNativeUtf8(),
+      StringUtf8Pointer(txComment).toNativeUtf8(),
+    );
+
+    return completer.future;
+  }
+
   static Pointer<Uint32> _listIntToPtrUint32(List<int> list) {
     final listUint32 = list.map((i) => i.toUnsigned(31)).toList();
     final Pointer<Uint32> ptr = malloc.allocate(listUint32.length);